Skip to content

Commit 346b78b

Browse files
committed
Add more xunit tests
1 parent ad80651 commit 346b78b

File tree

7 files changed

+275
-11
lines changed

7 files changed

+275
-11
lines changed

CefSharp.BrowserSubprocess.Core/BindObjectAsyncHandler.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@ namespace CefSharp
2525
{
2626
private:
2727
gcroot<RegisterBoundObjectRegistry^> _callbackRegistry;
28-
gcroot<Dictionary<String^, JavascriptObject^>^> _javascriptObjects;
28+
gcroot<IDictionary<String^, JavascriptObject^>^> _javascriptObjects;
2929
gcroot<CefBrowserWrapper^> _browserWrapper;
3030

3131
public:
32-
BindObjectAsyncHandler(RegisterBoundObjectRegistry^ callbackRegistery, Dictionary<String^, JavascriptObject^>^ javascriptObjects, CefBrowserWrapper^ browserWrapper)
32+
BindObjectAsyncHandler(RegisterBoundObjectRegistry^ callbackRegistery, IDictionary<String^, JavascriptObject^>^ javascriptObjects, CefBrowserWrapper^ browserWrapper)
3333
{
3434
_callbackRegistry = callbackRegistery;
3535
_javascriptObjects = javascriptObjects;

CefSharp.BrowserSubprocess.Core/RegisterBoundObjectHandler.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ namespace CefSharp
2727
private class RegisterBoundObjectHandler : public CefV8Handler
2828
{
2929
private:
30-
gcroot<Dictionary<String^, JavascriptObject^>^> _javascriptObjects;
30+
gcroot<IDictionary<String^, JavascriptObject^>^> _javascriptObjects;
3131

3232
public:
33-
RegisterBoundObjectHandler(Dictionary<String^, JavascriptObject^>^ javascriptObjects)
33+
RegisterBoundObjectHandler(IDictionary<String^, JavascriptObject^>^ javascriptObjects)
3434
{
3535
_javascriptObjects = javascriptObjects;
3636
}
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
using System.Collections.Generic;
2+
using CefSharp.Internals;
3+
using Xunit;
4+
5+
namespace CefSharp.Test.JavascriptBinding
6+
{
7+
public class LegacyJavaScriptObjectCacheTests
8+
{
9+
private const int BrowserId = 1;
10+
11+
[Fact]
12+
public void InsertOrUpdateShouldAddObjectsToCache()
13+
{
14+
// Arrange
15+
var cache = new LegacyJavaScriptObjectCache();
16+
var javascriptObjects = new List<JavascriptObject>
17+
{
18+
new JavascriptObject { Name = "Object1" },
19+
new JavascriptObject { Name = "Object2" }
20+
};
21+
22+
// Act
23+
cache.InsertOrUpdate(BrowserId, javascriptObjects);
24+
25+
// Assert
26+
var cachedValues = cache.GetCacheValues(BrowserId);
27+
Assert.Contains(javascriptObjects[0], cachedValues);
28+
Assert.Contains(javascriptObjects[1], cachedValues);
29+
}
30+
31+
[Fact]
32+
public void GetCacheValuesShouldReturnAllCachedObjects()
33+
{
34+
// Arrange
35+
var cache = new LegacyJavaScriptObjectCache();
36+
var javascriptObjects = new List<JavascriptObject>
37+
{
38+
new JavascriptObject { Name = "Object1" },
39+
new JavascriptObject { Name = "Object2" }
40+
};
41+
cache.InsertOrUpdate(BrowserId, javascriptObjects);
42+
43+
// Act
44+
var cachedValues = cache.GetCacheValues(BrowserId);
45+
46+
// Assert
47+
Assert.Equal(2, cachedValues.Count);
48+
}
49+
50+
[Fact]
51+
public void GetCacheShouldReturnUnderlyingDictionary()
52+
{
53+
// Arrange
54+
var cache = new LegacyJavaScriptObjectCache();
55+
var javascriptObjects = new List<JavascriptObject>
56+
{
57+
new JavascriptObject { Name = "Object1" }
58+
};
59+
cache.InsertOrUpdate(BrowserId, javascriptObjects);
60+
61+
// Act
62+
var cachedDictionary = cache.GetCache(BrowserId);
63+
64+
// Assert
65+
Assert.Single(cachedDictionary);
66+
Assert.True(cachedDictionary.ContainsKey("Object1"));
67+
}
68+
69+
[Fact]
70+
public void InsertOrUpdateShouldReplaceExistingObjects()
71+
{
72+
// Arrange
73+
var cache = new LegacyJavaScriptObjectCache();
74+
var initialObjects = new List<JavascriptObject>
75+
{
76+
new JavascriptObject { Name = "Object1" }
77+
};
78+
var updatedObjects = new List<JavascriptObject>
79+
{
80+
new JavascriptObject { Name = "Object1" }
81+
};
82+
cache.InsertOrUpdate(BrowserId, initialObjects);
83+
84+
// Act
85+
cache.InsertOrUpdate(BrowserId, updatedObjects);
86+
87+
// Assert
88+
var cachedValues = cache.GetCacheValues(BrowserId);
89+
Assert.DoesNotContain(initialObjects[0], cachedValues);
90+
Assert.Contains(updatedObjects[0], cachedValues);
91+
}
92+
93+
[Fact]
94+
public void InsertOrUpdateShouldAppendObjectsWithDifferentNames()
95+
{
96+
// Arrange
97+
var cache = new LegacyJavaScriptObjectCache();
98+
var initialObjects = new List<JavascriptObject>
99+
{
100+
new JavascriptObject { Name = "Object1" }
101+
};
102+
var updatedObjects = new List<JavascriptObject>
103+
{
104+
new JavascriptObject { Name = "Object2" }
105+
};
106+
cache.InsertOrUpdate(BrowserId, initialObjects);
107+
108+
// Act
109+
cache.InsertOrUpdate(BrowserId, updatedObjects);
110+
111+
// Assert
112+
var cachedValues = cache.GetCacheValues(BrowserId);
113+
Assert.Contains(initialObjects[0], cachedValues);
114+
Assert.Contains(updatedObjects[0], cachedValues);
115+
}
116+
117+
[Fact]
118+
public void ClearCacheShouldDoNothing()
119+
{
120+
// Arrange
121+
var cache = new LegacyJavaScriptObjectCache();
122+
var javascriptObjects = new List<JavascriptObject>
123+
{
124+
new JavascriptObject { Name = "Object1" }
125+
};
126+
cache.InsertOrUpdate(BrowserId, javascriptObjects);
127+
128+
// Act
129+
cache.ClearCache(BrowserId);
130+
131+
// Assert
132+
var cachedValues = cache.GetCacheValues(BrowserId);
133+
Assert.Contains(javascriptObjects[0], cachedValues);
134+
}
135+
}
136+
}
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using CefSharp.Internals;
4+
using Xunit;
5+
6+
namespace CefSharp.Test.JavascriptBinding
7+
{
8+
public class PerBrowserJavaScriptObjectCacheTests
9+
{
10+
private const int TestBrowserId = 1;
11+
12+
[Fact]
13+
public void ClearCacheRemovesCacheForBrowserId()
14+
{
15+
var cache = new PerBrowserJavaScriptObjectCache();
16+
cache.InsertOrUpdate(TestBrowserId, new List<JavascriptObject>
17+
{
18+
new JavascriptObject { Name = "TestObject" }
19+
});
20+
21+
cache.ClearCache(TestBrowserId);
22+
23+
Assert.Empty(cache.GetCacheValues(TestBrowserId));
24+
}
25+
26+
[Fact]
27+
public void InsertOrUpdateAddsOrUpdatesObjectsInCache()
28+
{
29+
var cache = new PerBrowserJavaScriptObjectCache();
30+
var javascriptObjects = new List<JavascriptObject>
31+
{
32+
new JavascriptObject { Name = "Object1" },
33+
new JavascriptObject { Name = "Object2" }
34+
};
35+
36+
cache.InsertOrUpdate(TestBrowserId, javascriptObjects);
37+
38+
var cachedObjects = cache.GetCacheValues(TestBrowserId);
39+
Assert.Equal(2, cachedObjects.Count);
40+
}
41+
42+
[Fact]
43+
public void GetCacheValuesReturnsEmptyCollectionWhenNoCacheExists()
44+
{
45+
var cache = new PerBrowserJavaScriptObjectCache();
46+
47+
var cachedObjects = cache.GetCacheValues(TestBrowserId);
48+
49+
Assert.Empty(cachedObjects);
50+
}
51+
52+
[Fact]
53+
public void GetCacheReturnsCacheDictionaryForBrowserId()
54+
{
55+
var cache = new PerBrowserJavaScriptObjectCache();
56+
var javascriptObjects = new List<JavascriptObject>
57+
{
58+
new JavascriptObject { Name = "Object1" }
59+
};
60+
cache.InsertOrUpdate(TestBrowserId, javascriptObjects);
61+
62+
var cachedDictionary = cache.GetCache(TestBrowserId);
63+
64+
Assert.Single(cachedDictionary);
65+
Assert.True(cachedDictionary.ContainsKey("Object1"));
66+
}
67+
68+
[Fact]
69+
public void ClearCacheDoesNotAffectOtherBrowserIds()
70+
{
71+
var cache = new PerBrowserJavaScriptObjectCache();
72+
cache.InsertOrUpdate(TestBrowserId, new List<JavascriptObject>
73+
{
74+
new JavascriptObject { Name = "Object1" }
75+
});
76+
cache.InsertOrUpdate(2, new List<JavascriptObject>
77+
{
78+
new JavascriptObject { Name = "Object2" }
79+
});
80+
81+
cache.ClearCache(TestBrowserId);
82+
83+
Assert.Empty(cache.GetCacheValues(TestBrowserId));
84+
Assert.NotEmpty(cache.GetCacheValues(2));
85+
}
86+
87+
[Fact]
88+
public void InsertOrUpdateOverwritesExistingCacheForBrowserId()
89+
{
90+
var cache = new PerBrowserJavaScriptObjectCache();
91+
92+
cache.InsertOrUpdate(TestBrowserId, new List<JavascriptObject>
93+
{
94+
new JavascriptObject { Name = "NewObject", Value = 1 }
95+
});
96+
97+
cache.InsertOrUpdate(TestBrowserId, new List<JavascriptObject>
98+
{
99+
new JavascriptObject { Name = "NewObject", Value = 2 }
100+
});
101+
102+
var cachedObjects = cache.GetCacheValues(TestBrowserId);
103+
Assert.Single(cachedObjects);
104+
Assert.Equal(2, cachedObjects.First().Value);
105+
}
106+
107+
[Fact]
108+
public void GetCacheReturnsEmptyForNonExistentBrowserId()
109+
{
110+
var cache = new PerBrowserJavaScriptObjectCache();
111+
112+
var cachedDictionary = cache.GetCache(999);
113+
114+
Assert.Empty(cachedDictionary);
115+
}
116+
117+
[Fact]
118+
public void InsertOrUpdateHandlesEmptyObjectList()
119+
{
120+
var cache = new PerBrowserJavaScriptObjectCache();
121+
122+
cache.InsertOrUpdate(TestBrowserId, new List<JavascriptObject>());
123+
124+
var cachedObjects = cache.GetCacheValues(TestBrowserId);
125+
Assert.Empty(cachedObjects);
126+
}
127+
}
128+
}

CefSharp/Internals/IJavaScriptObjectCache.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public interface IJavaScriptObjectCache
2222
/// <param name="browserId">browser Id</param>
2323
/// <returns>Dictionary of cache <see cref="JavascriptObject"/>'s.</returns>
2424
/// <exception cref="InvalidOperationException"></exception>
25-
Dictionary<string, JavascriptObject> GetCache(int browserId);
25+
IDictionary<string, JavascriptObject> GetCache(int browserId);
2626
/// <summary>
2727
/// Gets a collection of <see cref="JavascriptObject"/>s
2828
/// for the given <paramref name="browserId"/>
@@ -37,6 +37,6 @@ public interface IJavaScriptObjectCache
3737
/// <param name="browserId">browser id</param>
3838
/// <param name="javascriptObject">JavaScript object</param>
3939
/// <exception cref="InvalidOperationException"></exception>
40-
void InsertOrUpdate(int browserId, IList<JavascriptObject> javascriptObjects);
40+
void InsertOrUpdate(int browserId, IReadOnlyCollection<JavascriptObject> javascriptObjects);
4141
}
4242
}

CefSharp/Internals/LegacyJavaScriptObjectCache.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public void ClearCache(int browserId)
2222
}
2323

2424
/// <inheritdoc/>
25-
public void InsertOrUpdate(int browserId, IList<JavascriptObject> javascriptObjects)
25+
public void InsertOrUpdate(int browserId, IReadOnlyCollection<JavascriptObject> javascriptObjects)
2626
{
2727
foreach (var obj in javascriptObjects)
2828
{
@@ -37,7 +37,7 @@ public ICollection<JavascriptObject> GetCacheValues(int browserId)
3737
}
3838

3939
/// <inheritdoc/>
40-
public Dictionary<string, JavascriptObject> GetCache(int browserId)
40+
public IDictionary<string, JavascriptObject> GetCache(int browserId)
4141
{
4242
return cache;
4343
}

CefSharp/Internals/PerBrowserJavaScriptObjectCache.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public void ClearCache(int browserId)
2323
}
2424

2525
/// <inheritdoc/>
26-
public void InsertOrUpdate(int browserId, IList<JavascriptObject> javascriptObjects)
26+
public void InsertOrUpdate(int browserId, IReadOnlyCollection<JavascriptObject> javascriptObjects)
2727
{
2828
var dict = GetCacheInternal(browserId);
2929

@@ -45,14 +45,14 @@ public ICollection<JavascriptObject> GetCacheValues(int browserId)
4545
}
4646

4747
/// <inheritdoc/>
48-
public Dictionary<string, JavascriptObject> GetCache(int browserId)
48+
public IDictionary<string, JavascriptObject> GetCache(int browserId)
4949
{
5050
var dict = GetCacheInternal(browserId);
5151

5252
return dict;
5353
}
5454

55-
private Dictionary<string, JavascriptObject> GetCacheInternal(int browserId)
55+
private IDictionary<string, JavascriptObject> GetCacheInternal(int browserId)
5656
{
5757
Dictionary<string, JavascriptObject> dict;
5858

0 commit comments

Comments
 (0)