11using System . Collections ;
22using System . Text . Json . Nodes ;
33using NetDaemon . Extensions . MqttEntityManager . Helpers ;
4+ using Newtonsoft . Json ;
5+ using JsonSerializer = System . Text . Json . JsonSerializer ;
6+
47namespace NetDaemon . HassClient . Tests . ExtensionsTest . MqttEntityManagerTests ;
58
69public class JsonNodeExtensionTests
710{
8- class MergeTestData : IEnumerable < object [ ] >
11+ /// <summary>
12+ /// Test data for simple key=value structs
13+ /// </summary>
14+ class SimpleMergeTestData : IEnumerable < object [ ] >
915 {
1016 public IEnumerator < object [ ] > GetEnumerator ( )
1117 {
12- yield return new object [ ] { J ( new { a = "1" , b = "2" } ) , J ( new { } ) , J ( new { a = "1" , b = "2" } ) } ;
13- yield return new object [ ] { J ( new { a = "1" , b = "2" } ) , J ( new { c = "3" } ) , J ( new { a = "1" , b = "2" , c = "3" } ) } ;
14- yield return new object [ ] { J ( new { a = "1" , b = "2" } ) , J ( new { a = "5" } ) , J ( new { a = "5" , b = "2" } ) } ;
18+ yield return new object [ ] { J ( new { a = "1" , b = "2" } ) , J ( new { } ) , J ( new { a = "1" , b = "2" } ) } ;
19+ yield return new object [ ]
20+ { J ( new { a = "1" , b = "2" } ) , J ( new { c = "3" } ) , J ( new { a = "1" , b = "2" , c = "3" } ) } ;
21+ yield return new object [ ] { J ( new { a = "1" , b = "2" } ) , J ( new { a = "5" } ) , J ( new { a = "5" , b = "2" } ) } ;
1522 }
1623
1724 IEnumerator IEnumerable . GetEnumerator ( )
@@ -20,9 +27,15 @@ IEnumerator IEnumerable.GetEnumerator()
2027 }
2128 }
2229
30+ /// <summary>
31+ /// Test for simple key=value structs
32+ /// </summary>
33+ /// <param name="target"></param>
34+ /// <param name="toMerge"></param>
35+ /// <param name="expected"></param>
2336 [ Theory ]
24- [ ClassData ( typeof ( MergeTestData ) ) ]
25- public void CanMerge ( JsonObject target , JsonObject ? toMerge , JsonObject expected )
37+ [ ClassData ( typeof ( SimpleMergeTestData ) ) ]
38+ public void CanMergeSimpleDictionaries ( JsonObject target , JsonObject ? toMerge , JsonObject expected )
2639 {
2740 target . AddRange ( toMerge ) ;
2841
@@ -33,6 +46,113 @@ public void CanMerge(JsonObject target, JsonObject? toMerge, JsonObject expected
3346 targetDict . Should ( ) . BeEquivalentTo ( expectedDict ) ;
3447 }
3548
49+ [ Fact ]
50+ public void CanAddComplexToSimple ( )
51+ {
52+ var o1 = new { a = 1 , b = 2 , c = 3 } ;
53+ var o2 = new { d = new { x = 8 , y = 9 } } ;
54+
55+ var j1 = J ( o1 ) ;
56+
57+ j1 . AddRange ( J ( o2 ) ) ;
58+ var combined = JsonConvert . DeserializeObject < dynamic > ( j1 . ToJsonString ( ) ) ;
59+ Assert . Equal ( "1" , combined . a . ToString ( ) ) ;
60+ Assert . Equal ( "2" , combined . b . ToString ( ) ) ;
61+ Assert . Equal ( "3" , combined . c . ToString ( ) ) ;
62+ Assert . Equal ( "8" , combined . d . x . ToString ( ) ) ;
63+ Assert . Equal ( "9" , combined . d . y . ToString ( ) ) ;
64+ }
65+
66+ [ Fact ]
67+ public void CanMergeSimpleIntoComplex ( )
68+ {
69+ var o1 = new { a = 1 , b = 2 , c = new { x = 8 , y = 9 } } ;
70+ var o2 = new { a = 3 } ;
71+
72+ var j1 = J ( o1 ) ;
73+
74+ j1 . AddRange ( J ( o2 ) ) ;
75+ var combined = JsonConvert . DeserializeObject < dynamic > ( j1 . ToJsonString ( ) ) ;
76+ Assert . Equal ( "3" , combined . a . ToString ( ) ) ;
77+ Assert . Equal ( "2" , combined . b . ToString ( ) ) ;
78+ Assert . Equal ( "8" , combined . c . x . ToString ( ) ) ;
79+ Assert . Equal ( "9" , combined . c . y . ToString ( ) ) ;
80+ }
81+
82+ [ Fact ]
83+ public void CanMergeComplexIntoSimple ( )
84+ {
85+ var o1 = new { a = 1 , b = 2 , c = 3 } ;
86+ var o2 = new { c = new { x = 8 , y = 9 } } ;
87+
88+ var j1 = J ( o1 ) ;
89+
90+ j1 . AddRange ( J ( o2 ) ) ;
91+ var combined = JsonConvert . DeserializeObject < dynamic > ( j1 . ToJsonString ( ) ) ;
92+ Assert . Equal ( "1" , combined . a . ToString ( ) ) ;
93+ Assert . Equal ( "2" , combined . b . ToString ( ) ) ;
94+ Assert . Equal ( "8" , combined . c . x . ToString ( ) ) ;
95+ Assert . Equal ( "9" , combined . c . y . ToString ( ) ) ;
96+ }
97+
98+ [ Fact ]
99+ public void CanMergeComplexIntoComplex ( )
100+ {
101+ var o1 = new { a = 1 , b = new { q = 10 , r = 11 } , c = 3 } ;
102+ var o2 = new { c = new { x = 8 , y = 9 } } ;
103+
104+ var j1 = J ( o1 ) ;
105+
106+ j1 . AddRange ( J ( o2 ) ) ;
107+ var combined = JsonConvert . DeserializeObject < dynamic > ( j1 . ToJsonString ( ) ) ;
108+ Assert . Equal ( "1" , combined . a . ToString ( ) ) ;
109+ Assert . Equal ( "10" , combined . b . q . ToString ( ) ) ;
110+ Assert . Equal ( "11" , combined . b . r . ToString ( ) ) ;
111+ Assert . Equal ( "8" , combined . c . x . ToString ( ) ) ;
112+ Assert . Equal ( "9" , combined . c . y . ToString ( ) ) ;
113+ }
114+
115+ [ Fact ]
116+ public void CanMergeMultiLayerComplex ( )
117+ {
118+ var o1 = new { a = 1 , b = 2 , c = 3 } ;
119+ var o2 = new
120+ {
121+ person =
122+ new
123+ {
124+ name = new
125+ {
126+ surname = "smith" , forename = "john"
127+ } ,
128+ age = new
129+ {
130+ quantity = 11000 , unit = "days"
131+ }
132+ } ,
133+ id = new
134+ {
135+ style = "numeric" ,
136+ value = 1234
137+ }
138+ } ;
139+
140+ var j1 = J ( o1 ) ;
141+ j1 . AddRange ( J ( o2 ) ) ;
142+ var combined = JsonConvert . DeserializeObject < dynamic > ( j1 . ToJsonString ( ) ) ;
143+
144+ Assert . Equal ( "1" , combined . a . ToString ( ) ) ;
145+ Assert . Equal ( "2" , combined . b . ToString ( ) ) ;
146+ Assert . Equal ( "3" , combined . c . ToString ( ) ) ;
147+ Assert . Equal ( "smith" , combined . person . name . surname . ToString ( ) ) ;
148+ Assert . Equal ( "john" , combined . person . name . forename . ToString ( ) ) ;
149+ Assert . Equal ( "11000" , combined . person . age . quantity . ToString ( ) ) ;
150+ Assert . Equal ( "days" , combined . person . age . unit . ToString ( ) ) ;
151+ Assert . Equal ( "numeric" , combined . id . style . ToString ( ) ) ;
152+ Assert . Equal ( "1234" , combined . id . value . ToString ( ) ) ;
153+ }
154+
155+
36156 private static JsonObject J ( dynamic o )
37157 {
38158 return JsonSerializer . SerializeToNode ( o ) ;
0 commit comments