Skip to content

Commit f299f97

Browse files
committed
#16 - add IsSubsetOf method to ObjectType with comprehensive tests
1 parent 109832a commit f299f97

File tree

2 files changed

+207
-0
lines changed

2 files changed

+207
-0
lines changed

src/Domain/HydraScript.Domain.IR/Types/ObjectType.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,18 @@ public bool HasMethod(string methodName)
3434
return _methods.Any(x => x.HasName(methodName));
3535
}
3636

37+
public bool IsSubsetOf(ObjectType that)
38+
{
39+
foreach (var key in that._properties.Keys)
40+
{
41+
var hasProperty = _properties.TryGetValue(key, out var type);
42+
if (!hasProperty || !that[key]!.Equals(type))
43+
return false;
44+
}
45+
46+
return true;
47+
}
48+
3749
public override void ResolveReference(
3850
Type reference,
3951
string refId,

tests/HydraScript.UnitTests/Domain/IR/ObjectTypeTests.cs

Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,4 +118,199 @@ public void SerializationOfTypeWithRecursivePropertyTest()
118118

119119
Assert.Contains("next: next;", linkedListType.ToString());
120120
}
121+
122+
[Fact]
123+
public void IsSubsetOf_SubsetHasFewerProperties_ReturnsTrue()
124+
{
125+
// Arrange
126+
var number = new Type("number");
127+
var supersetType = new ObjectType(new Dictionary<string, Type>
128+
{
129+
["x"] = number,
130+
["y"] = number,
131+
["z"] = number
132+
});
133+
var subsetType = new ObjectType(new Dictionary<string, Type>
134+
{
135+
["x"] = number,
136+
["y"] = number
137+
});
138+
139+
// Act
140+
var result = supersetType.IsSubsetOf(subsetType);
141+
142+
// Assert
143+
Assert.True(result);
144+
}
145+
146+
[Fact]
147+
public void IsSubsetOf_SubsetHasSameProperties_ReturnsTrue()
148+
{
149+
// Arrange
150+
var number = new Type("number");
151+
var supersetType = new ObjectType(new Dictionary<string, Type>
152+
{
153+
["x"] = number,
154+
["y"] = number
155+
});
156+
var subsetType = new ObjectType(new Dictionary<string, Type>
157+
{
158+
["x"] = number,
159+
["y"] = number
160+
});
161+
162+
// Act
163+
var result = supersetType.IsSubsetOf(subsetType);
164+
165+
// Assert
166+
Assert.True(result);
167+
}
168+
169+
[Fact]
170+
public void IsSubsetOf_SubsetHasExtraProperties_ReturnsFalse()
171+
{
172+
// Arrange
173+
var number = new Type("number");
174+
var supersetType = new ObjectType(new Dictionary<string, Type>
175+
{
176+
["x"] = number,
177+
["y"] = number
178+
});
179+
var subsetType = new ObjectType(new Dictionary<string, Type>
180+
{
181+
["x"] = number,
182+
["y"] = number,
183+
["z"] = number
184+
});
185+
186+
// Act
187+
var result = supersetType.IsSubsetOf(subsetType);
188+
189+
// Assert
190+
Assert.False(result);
191+
}
192+
193+
[Fact]
194+
public void IsSubsetOf_PropertyTypesMismatch_ReturnsFalse()
195+
{
196+
// Arrange
197+
var number = new Type("number");
198+
var stringType = new Type("string");
199+
var supersetType = new ObjectType(new Dictionary<string, Type>
200+
{
201+
["x"] = number,
202+
["y"] = number
203+
});
204+
var subsetType = new ObjectType(new Dictionary<string, Type>
205+
{
206+
["x"] = number,
207+
["y"] = stringType
208+
});
209+
210+
// Act
211+
var result = supersetType.IsSubsetOf(subsetType);
212+
213+
// Assert
214+
Assert.False(result);
215+
}
216+
217+
[Fact]
218+
public void IsSubsetOf_EmptySubset_ReturnsTrue()
219+
{
220+
// Arrange
221+
var number = new Type("number");
222+
var supersetType = new ObjectType(new Dictionary<string, Type>
223+
{
224+
["x"] = number,
225+
["y"] = number
226+
});
227+
var emptySubsetType = new ObjectType(new Dictionary<string, Type>());
228+
229+
// Act
230+
var result = supersetType.IsSubsetOf(emptySubsetType);
231+
232+
// Assert
233+
Assert.True(result);
234+
}
235+
236+
[Fact]
237+
public void IsSubsetOf_SameObjectReference_ReturnsTrue()
238+
{
239+
// Arrange
240+
var number = new Type("number");
241+
var objectType = new ObjectType(new Dictionary<string, Type>
242+
{
243+
["x"] = number,
244+
["y"] = number
245+
});
246+
247+
// Act
248+
var result = objectType.IsSubsetOf(objectType);
249+
250+
// Assert
251+
Assert.True(result);
252+
}
253+
254+
[Fact]
255+
public void IsSubsetOf_ComplexNestedTypes_ReturnsTrue()
256+
{
257+
// Arrange
258+
var number = new Type("number");
259+
var nestedObject = new ObjectType(new Dictionary<string, Type>
260+
{
261+
["a"] = number,
262+
["b"] = number
263+
});
264+
var arrayType = new ArrayType(number);
265+
266+
var supersetType = new ObjectType(new Dictionary<string, Type>
267+
{
268+
["nested"] = nestedObject,
269+
["array"] = arrayType,
270+
["simple"] = number
271+
});
272+
var subsetType = new ObjectType(new Dictionary<string, Type>
273+
{
274+
["nested"] = nestedObject,
275+
["array"] = arrayType
276+
});
277+
278+
// Act
279+
var result = supersetType.IsSubsetOf(subsetType);
280+
281+
// Assert
282+
Assert.True(result);
283+
}
284+
285+
[Fact]
286+
public void IsSubsetOf_ComplexNestedTypesMismatch_ReturnsFalse()
287+
{
288+
// Arrange
289+
var number = new Type("number");
290+
var nestedObject1 = new ObjectType(new Dictionary<string, Type>
291+
{
292+
["a"] = number,
293+
["b"] = number
294+
});
295+
var nestedObject2 = new ObjectType(new Dictionary<string, Type>
296+
{
297+
["a"] = number,
298+
["c"] = number
299+
});
300+
301+
var supersetType = new ObjectType(new Dictionary<string, Type>
302+
{
303+
["nested"] = nestedObject1
304+
});
305+
var subsetType = new ObjectType(new Dictionary<string, Type>
306+
{
307+
["nested"] = nestedObject2
308+
});
309+
310+
// Act
311+
var result = supersetType.IsSubsetOf(subsetType);
312+
313+
// Assert
314+
Assert.False(result);
315+
}
121316
}

0 commit comments

Comments
 (0)