22using Jint . Native ;
33using Jint . Native . Symbol ;
44
5- namespace Jint . Tests . PublicInterface
5+ namespace Jint . Tests . PublicInterface ;
6+
7+ public partial class InteropTests
68{
7- public partial class InteropTests
9+ [ Fact ]
10+ public void CanAccessExpandoObject ( )
811 {
9- [ Fact ]
10- public void CanAccessExpandoObject ( )
11- {
12- var engine = new Engine ( ) ;
13- dynamic expando = new ExpandoObject ( ) ;
14- expando . Name = "test" ;
15- engine . SetValue ( "expando" , expando ) ;
16- Assert . Equal ( "test" , engine . Evaluate ( "expando.Name" ) . ToString ( ) ) ;
17- }
18-
19- [ Fact ]
20- public void DebugView ( )
21- {
22- // allows displaying different local variables under debugger
23-
24- var engine = new Engine ( ) ;
25- var boolNet = true ;
26- var boolJint = ( JsBoolean ) boolNet ;
27- var doubleNet = 12.34 ;
28- var doubleJint = ( JsNumber ) doubleNet ;
29- var integerNet = 42 ;
30- var integerJint = ( JsNumber ) integerNet ;
31- var stringNet = "ABC" ;
32- var stringJint = ( JsString ) stringNet ;
33- var arrayNet = new [ ] { 1 , 2 , 3 } ;
34- var arrayListNet = new List < int > { 1 , 2 , 3 } ;
35- var arrayJint = new JsArray ( engine , arrayNet . Select ( x => ( JsNumber ) x ) . ToArray ( ) ) ;
36-
37- var objectNet = new Person { Name = "name" , Age = 12 } ;
38- var objectJint = new JsObject ( engine ) ;
39- objectJint [ "name" ] = "name" ;
40- objectJint [ "age" ] = 12 ;
41- objectJint [ GlobalSymbolRegistry . ToStringTag ] = "Object" ;
42-
43- var dictionaryNet = new Dictionary < JsValue , JsValue > ( ) ;
44- dictionaryNet [ "name" ] = "name" ;
45- dictionaryNet [ "age" ] = 12 ;
46- dictionaryNet [ GlobalSymbolRegistry . ToStringTag ] = "Object" ;
47- }
12+ var engine = new Engine ( ) ;
13+ dynamic expando = new ExpandoObject ( ) ;
14+ expando . Name = "test" ;
15+ engine . SetValue ( "expando" , expando ) ;
16+ Assert . Equal ( "test" , engine . Evaluate ( "expando.Name" ) . ToString ( ) ) ;
17+ }
4818
49- [ Fact ]
50- public void CanAccessMemberNamedItemThroughExpando ( )
51- {
52- var parent = ( IDictionary < string , object > ) new ExpandoObject ( ) ;
53- var child = ( IDictionary < string , object > ) new ExpandoObject ( ) ;
54- var values = ( IDictionary < string , object > ) new ExpandoObject ( ) ;
19+ [ Fact ]
20+ public void DebugView ( )
21+ {
22+ // allows displaying different local variables under debugger
23+
24+ var engine = new Engine ( ) ;
25+ var boolNet = true ;
26+ var boolJint = ( JsBoolean ) boolNet ;
27+ var doubleNet = 12.34 ;
28+ var doubleJint = ( JsNumber ) doubleNet ;
29+ var integerNet = 42 ;
30+ var integerJint = ( JsNumber ) integerNet ;
31+ var stringNet = "ABC" ;
32+ var stringJint = ( JsString ) stringNet ;
33+ var arrayNet = new [ ] { 1 , 2 , 3 } ;
34+ var arrayListNet = new List < int > { 1 , 2 , 3 } ;
35+ var arrayJint = new JsArray ( engine , arrayNet . Select ( x => ( JsNumber ) x ) . ToArray ( ) ) ;
36+
37+ var objectNet = new Person { Name = "name" , Age = 12 } ;
38+ var objectJint = new JsObject ( engine ) ;
39+ objectJint [ "name" ] = "name" ;
40+ objectJint [ "age" ] = 12 ;
41+ objectJint [ GlobalSymbolRegistry . ToStringTag ] = "Object" ;
42+
43+ var dictionaryNet = new Dictionary < JsValue , JsValue > ( ) ;
44+ dictionaryNet [ "name" ] = "name" ;
45+ dictionaryNet [ "age" ] = 12 ;
46+ dictionaryNet [ GlobalSymbolRegistry . ToStringTag ] = "Object" ;
47+ }
5548
56- parent [ "child" ] = child ;
57- child [ "item" ] = values ;
58- values [ "title" ] = "abc" ;
49+ [ Fact ]
50+ public void CanAccessMemberNamedItemThroughExpando ( )
51+ {
52+ var parent = ( IDictionary < string , object > ) new ExpandoObject ( ) ;
53+ var child = ( IDictionary < string , object > ) new ExpandoObject ( ) ;
54+ var values = ( IDictionary < string , object > ) new ExpandoObject ( ) ;
5955
60- _engine . SetValue ( " parent" , parent ) ;
61- Assert . Equal ( "abc" , _engine . Evaluate ( "parent. child. item.title" ) ) ;
62- }
56+ parent [ "child" ] = child ;
57+ child [ " item" ] = values ;
58+ values [ "title" ] = "abc" ;
6359
64- [ Fact ]
65- public void ShouldForOfOnExpandoObject ( )
66- {
67- dynamic o = new ExpandoObject ( ) ;
68- o . a = 1 ;
69- o . b = 2 ;
60+ _engine . SetValue ( "parent" , parent ) ;
61+ Assert . Equal ( "abc" , _engine . Evaluate ( "parent.child.item.title" ) ) ;
62+ }
7063
71- _engine . SetValue ( "dynamic" , o ) ;
64+ [ Fact ]
65+ public void ShouldForOfOnExpandoObject ( )
66+ {
67+ dynamic o = new ExpandoObject ( ) ;
68+ o . a = 1 ;
69+ o . b = 2 ;
7270
73- var result = _engine . Evaluate ( "var l = ''; for (var x of dynamic) l += x; return l;" ) . AsString ( ) ;
71+ _engine . SetValue ( " dynamic" , o ) ;
7472
75- Assert . Equal ( "a,1b,2" , result ) ;
76- }
73+ var result = _engine . Evaluate ( "var l = ''; for (var x of dynamic) l += x; return l;" ) . AsString ( ) ;
7774
78- [ Fact ]
79- public void ShouldConvertObjectInstanceToExpando ( )
80- {
81- _engine . Evaluate ( "var o = {a: 1, b: 'foo'}" ) ;
82- var result = _engine . GetValue ( "o" ) ;
75+ Assert . Equal ( "a,1b,2" , result ) ;
76+ }
8377
84- dynamic value = result . ToObject ( ) ;
78+ [ Fact ]
79+ public void ShouldConvertObjectInstanceToExpando ( )
80+ {
81+ _engine . Evaluate ( "var o = {a: 1, b: 'foo'}" ) ;
82+ var result = _engine . GetValue ( "o" ) ;
8583
86- Assert . Equal ( 1 , value . a ) ;
87- Assert . Equal ( "foo" , value . b ) ;
84+ dynamic value = result . ToObject ( ) ;
8885
89- var dic = ( IDictionary < string , object > ) result . ToObject ( ) ;
86+ Assert . Equal ( 1 , value . a ) ;
87+ Assert . Equal ( "foo" , value . b ) ;
9088
91- Assert . Equal ( 1d , dic [ "a" ] ) ;
92- Assert . Equal ( "foo" , dic [ "b" ] ) ;
93- }
89+ var dic = ( IDictionary < string , object > ) result . ToObject ( ) ;
9490
95- [ Fact ]
96- public void CanAccessDynamicObject ( )
97- {
98- var test = new DynamicClass ( ) ;
99- var engine = new Engine ( ) ;
100-
101- engine . SetValue ( "test" , test ) ;
91+ Assert . Equal ( 1d , dic [ "a" ] ) ;
92+ Assert . Equal ( "foo" , dic [ "b" ] ) ;
93+ }
10294
103- Assert . Equal ( "a" , engine . Evaluate ( "test.a" ) . AsString ( ) ) ;
104- Assert . Equal ( "b" , engine . Evaluate ( "test.b" ) . AsString ( ) ) ;
95+ [ Fact ]
96+ public void CanAccessDynamicObject ( )
97+ {
98+ var test = new DynamicClass ( ) ;
99+ var engine = new Engine ( ) ;
105100
106- engine . Evaluate ( "test.a = 5; test.b = 10; test.Name = 'Jint'" ) ;
101+ engine . SetValue ( "test" , test ) ;
107102
108- Assert . Equal ( 5 , engine . Evaluate ( "test.a" ) . AsNumber ( ) ) ;
109- Assert . Equal ( 10 , engine . Evaluate ( "test.b" ) . AsNumber ( ) ) ;
103+ Assert . Equal ( "a" , engine . Evaluate ( "test.a" ) . AsString ( ) ) ;
104+ Assert . Equal ( "b" , engine . Evaluate ( "test.b" ) . AsString ( ) ) ;
110105
111- Assert . Equal ( "Jint" , engine . Evaluate ( "test.Name" ) . AsString ( ) ) ;
112- Assert . True ( engine . Evaluate ( "test.ContainsKey('a')" ) . AsBoolean ( ) ) ;
113- Assert . True ( engine . Evaluate ( "test.ContainsKey('b')" ) . AsBoolean ( ) ) ;
114- Assert . False ( engine . Evaluate ( "test.ContainsKey('c')" ) . AsBoolean ( ) ) ;
115- }
106+ engine . Evaluate ( "test.a = 5; test.b = 10; test.Name = 'Jint'" ) ;
116107
117- private class DynamicClass : DynamicObject
118- {
119- private readonly Dictionary < string , object > _properties = new Dictionary < string , object > ( ) ;
108+ Assert . Equal ( 5 , engine . Evaluate ( "test.a" ) . AsNumber ( ) ) ;
109+ Assert . Equal ( 10 , engine . Evaluate ( "test.b" ) . AsNumber ( ) ) ;
120110
121- public override bool TryGetMember ( GetMemberBinder binder , out object result )
122- {
123- result = binder . Name ;
124- if ( _properties . TryGetValue ( binder . Name , out var value ) )
125- {
126- result = value ;
127- }
111+ Assert . Equal ( "Jint" , engine . Evaluate ( "test.Name" ) . AsString ( ) ) ;
112+ Assert . True ( engine . Evaluate ( "test.ContainsKey('a')" ) . AsBoolean ( ) ) ;
113+ Assert . True ( engine . Evaluate ( "test.ContainsKey('b')" ) . AsBoolean ( ) ) ;
114+ Assert . False ( engine . Evaluate ( "test.ContainsKey('c')" ) . AsBoolean ( ) ) ;
115+ }
128116
129- return true ;
130- }
117+ private class DynamicClass : DynamicObject
118+ {
119+ private readonly Dictionary < string , object > _properties = new Dictionary < string , object > ( ) ;
131120
132- public override bool TrySetMember ( SetMemberBinder binder , object value )
121+ public override bool TryGetMember ( GetMemberBinder binder , out object result )
122+ {
123+ result = binder . Name ;
124+ if ( _properties . TryGetValue ( binder . Name , out var value ) )
133125 {
134- _properties [ binder . Name ] = value ;
135- return true ;
126+ result = value ;
136127 }
137128
138- public string Name { get ; set ; }
129+ return true ;
130+ }
139131
140- public bool ContainsKey ( string key )
141- {
142- return _properties . ContainsKey ( key ) ;
143- }
132+ public override bool TrySetMember ( SetMemberBinder binder , object value )
133+ {
134+ _properties [ binder . Name ] = value ;
135+ return true ;
144136 }
145137
146- private class Person
138+ public string Name { get ; set ; }
139+
140+ public bool ContainsKey ( string key )
147141 {
148- public string Name { get ; set ; }
149- public int Age { get ; set ; }
142+ return _properties . ContainsKey ( key ) ;
150143 }
151144 }
152- }
145+
146+ private class Person
147+ {
148+ public string Name { get ; set ; }
149+ public int Age { get ; set ; }
150+ }
151+ }
0 commit comments