@@ -36,11 +36,13 @@ mod test {
36
36
use crate :: core:: context:: context:: Context ;
37
37
use crate :: core:: export:: export:: Export ;
38
38
use crate :: core:: lang:: execution:: round;
39
- use crate :: core:: lang:: lang:: { branch, foldhood, nbr, rep} ;
39
+ use crate :: core:: lang:: lang:: { branch, foldhood, mid , nbr, rep} ;
40
40
use crate :: core:: path:: path:: path:: Path ;
41
41
use crate :: core:: path:: slot:: slot:: Slot :: { FoldHood , Nbr , Rep } ;
42
42
use crate :: core:: sensor_id:: sensor_id:: SensorId ;
43
43
use crate :: core:: vm:: round_vm:: round_vm:: RoundVM ;
44
+ use crate :: export;
45
+ use crate :: path;
44
46
45
47
fn init_vm ( ) -> RoundVM {
46
48
let context = Context :: new ( 0 , Default :: default ( ) , Default :: default ( ) , Default :: default ( ) ) ;
@@ -83,82 +85,73 @@ mod test {
83
85
84
86
#[ test]
85
87
fn test_local_value ( ) {
86
- let context = Context :: new ( 0 ,
87
- Default :: default ( ) ,
88
- Default :: default ( ) ,
89
- Default :: default ( ) ) ;
88
+ let context = Context :: new ( 0 , Default :: default ( ) , Default :: default ( ) , Default :: default ( ) ) ;
90
89
let result = round ( init_with_ctx ( context) , |vm| ( vm, 10 ) ) ;
91
90
assert_eq ! ( 10 , result. 1 ) ;
92
91
}
93
92
94
93
#[ test]
95
94
fn test_alignment ( ) {
96
95
// No neighbor is aligned
97
- let context = Context :: new ( 0 , Default :: default ( ) ,
98
- Default :: default ( ) , Default :: default ( ) ) ;
99
- let result = round ( init_with_ctx ( context) ,
100
- |vm1| rep ( vm1, || 0 , |vm2, _| {
101
- foldhood ( vm2, || 0 ,
102
- | a, b | ( a + b) , || 1 ) } ) ) ;
96
+ let context = Context :: new ( 0 , Default :: default ( ) , Default :: default ( ) , Default :: default ( ) ) ;
97
+ // Program: rep(0, foldhood(0)(_ + _)(1))
98
+ let program = |vm1| rep ( vm1,
99
+ || 0 ,
100
+ |vm2, _| { foldhood ( vm2,
101
+ || 0 ,
102
+ | a, b | ( a + b) ,
103
+ |vm3| ( vm3, 1 ) ) } ) ;
104
+ let result = round ( init_with_ctx ( context) , program) ;
103
105
assert_eq ! ( 1 , result. 1 ) ;
104
106
105
107
// One neighbor is aligned
106
- let mut exports: HashMap < i32 , Export > = HashMap :: new ( ) ;
107
- exports. insert ( 1 , create_export ( ) ) ;
108
-
109
- let context = Context :: new ( 0 , Default :: default ( ) ,
110
- Default :: default ( ) , exports) ;
111
-
112
- let result = round ( init_with_ctx ( context) ,
113
- |vm1| rep ( vm1, || 0 , |vm2, _| {
114
- foldhood ( vm2, || 0 ,
115
- | a, b| ( a + b) , || 1 ) } ) ) ;
108
+ // Export: Map(1 -> Export(Rep(0) -> 1, Rep(0) / FoldHood(0) -> 1))
109
+ let context = Context :: new ( 0 , Default :: default ( ) , Default :: default ( ) , create_export_alignment_test ( ) ) ;
110
+ let result = round ( init_with_ctx ( context) , program) ;
116
111
assert_eq ! ( 2 , result. 1 ) ;
117
112
}
118
113
119
- fn create_export ( ) -> Export {
120
- let mut map: HashMap < Path , Box < dyn Any > > = HashMap :: new ( ) ;
121
- map. insert ( Path :: from ( vec ! [ Rep ( 0 ) ] ) , Box :: new ( 1 ) ) ;
122
- map. insert ( Path :: from ( vec ! [ Rep ( 0 ) , FoldHood ( 0 ) ] ) , Box :: new ( 1 ) ) ;
123
- Export :: from ( map)
124
- }
125
-
126
- fn create_context_foldhood_test ( ) -> Context {
127
- // Export of device 2: Export(/ -> "1", FoldHood(0) -> "1")
128
- let mut exports_device_2: HashMap < Path , Box < dyn Any > > = HashMap :: new ( ) ;
129
- exports_device_2. insert ( Path :: from ( vec ! [ FoldHood ( 0 ) ] ) , Box :: new ( 1 ) ) ;
130
- exports_device_2. insert ( Path :: from ( vec ! [ ] ) , Box :: new ( 1 ) ) ;
131
- // Export of device 4: Export(/ -> "3", FoldHood(0) -> "3")
132
- let mut exports_device_4: HashMap < Path , Box < dyn Any > > = HashMap :: new ( ) ;
133
- exports_device_4. insert ( Path :: from ( vec ! [ FoldHood ( 0 ) ] ) , Box :: new ( 3 ) ) ;
134
- exports_device_4. insert ( Path :: from ( vec ! [ ] ) , Box :: new ( 3 ) ) ;
135
- // Exports of the context: Map(2 -> Export(/ -> "a", FoldHood(0) -> "a"), 4 -> Export(/ -> "b", FoldHood(0) -> "b"))
114
+ fn create_export_alignment_test ( ) -> HashMap < i32 , Export > {
115
+ let export_dev_1 = export ! ( ( path!( Rep ( 0 ) ) , 1 ) , ( path!( Rep ( 0 ) , FoldHood ( 0 ) ) , 1 ) ) ;
136
116
let mut exports: HashMap < i32 , Export > = HashMap :: new ( ) ;
137
- exports. insert ( 2 , Export :: from ( exports_device_2) ) ;
138
- exports. insert ( 4 , Export :: from ( exports_device_4) ) ;
139
- // Context of the device
140
- let context = Context :: new ( 0 , Default :: default ( ) , Default :: default ( ) , exports) ;
141
- return context;
117
+ exports. insert ( 1 , export_dev_1) ;
118
+ exports
142
119
}
143
120
144
121
#[ test]
145
122
fn test_foldhood ( ) {
146
- // Context of the device
147
- let context = create_context_foldhood_test ( ) ;
148
- // Aggregate program in Scala: foldhood("1")(_ + _)("2")
149
- let result = round ( init_with_ctx ( context) ,
150
- |vm| foldhood ( vm, || 1 ,
151
- | a, b| ( a + b) , || 2 ) ) ;
123
+ let context = Context :: new ( 0 , Default :: default ( ) , Default :: default ( ) , create_export_foldhood_test ( ) ) ;
124
+ // Program: foldhood(1)(_ + _)(2)
125
+ let program = |vm| foldhood ( vm,
126
+ || 1 ,
127
+ | a, b| ( a + b) ,
128
+ |vm1| ( vm1, 2 ) ) ;
129
+ let result = round ( init_with_ctx ( context) , program) ;
152
130
assert_eq ! ( 7 , result. 1 ) ;
153
131
154
- // TODO
155
- //let context = create_context_foldhood_test();
156
- // Aggregate program in Scala: foldhood("-5")(_ + _)(if (nbr(false)) {0} else {1})
157
- //let result = round(init_with_ctx(context),
158
- //|vm| foldhood(vm, || -5,
159
- // | a, b| (a + b),
160
- //|vm1| if nbr(vm1, || false).1 {0} else {1} ));
161
- //assert_eq!(-14, result.1);
132
+ let context = Context :: new ( 0 , Default :: default ( ) , Default :: default ( ) , create_export_foldhood_test ( ) ) ;
133
+ // Program: foldhood(-5)(_ + _)(if (nbr(false)) {0} else {1})
134
+ let program = |vm| foldhood ( vm,
135
+ || -5 ,
136
+ | a, b| ( a + b) ,
137
+ |vm1| {
138
+ let ( vm2, res) = nbr ( vm1, || false ) ;
139
+ if res { ( vm2, 0 ) } else { ( vm2, 1 ) }
140
+ } ) ;
141
+ let result = round ( init_with_ctx ( context) , program) ;
142
+ assert_eq ! ( -14 , result. 1 ) ;
143
+ }
144
+
145
+ fn create_export_foldhood_test ( ) -> HashMap < i32 , Export > {
146
+ // Export of device 2: Export(/ -> "1", FoldHood(0) -> "1")
147
+ let export_dev_2 = export ! ( ( path!( ) , 1 ) , ( path!( FoldHood ( 0 ) ) , 1 ) ) ;
148
+ // Export of device 4: Export(/ -> "3", FoldHood(0) -> "3")
149
+ let export_dev_4 = export ! ( ( path!( ) , 3 ) , ( path!( FoldHood ( 0 ) ) , 3 ) ) ;
150
+ // Exports of the context: Map(2 -> Export(/ -> "a", FoldHood(0) -> "a"), 4 -> Export(/ -> "b", FoldHood(0) -> "b"))
151
+ let mut exports: HashMap < i32 , Export > = HashMap :: new ( ) ;
152
+ exports. insert ( 2 , export_dev_2) ;
153
+ exports. insert ( 4 , export_dev_4) ;
154
+ exports
162
155
}
163
156
164
157
#[ test]
@@ -169,36 +162,30 @@ mod test {
169
162
assert_eq ! ( 7 , result. 1 ) ;
170
163
171
164
// 2 - NBR should support interaction between aligned devices
172
- // let context = create_context_nbr_test2();
173
- // The following program is run: foldhood(0)(_ + _)(if (nbr(mid()) == mid()) 0 else 1)
174
- // TODO
175
- //let program = |vm| foldhood(vm,
176
- // || 0,
177
- // | a, b| (a + b),
178
- // |vm1| if nbr(vm1, mid()) == mid() {0} else {1} );
165
+ let context = Context :: new ( 0 , Default :: default ( ) , Default :: default ( ) , create_exports_nbr_test ( ) ) ;
166
+ // Program: foldhood(0)(_ + _)(if (nbr(mid()) == mid()) 0 else 1)
167
+ /*let program = |vm| foldhood(vm,
168
+ || 0,
169
+ | a, b| (a + b),
170
+ |vm1| {
171
+ let (vm2, res) = nbr(vm1, || mid(vm3));
172
+ if res.1 == mid(vm2).1 { (res.0, 0) } else { (res.0, 1) }
173
+ }); */
179
174
//let result = round(init_with_ctx(context), program);
180
- // assert_eq!(2, result.1);
175
+ //assert_eq!(2, result.1);
181
176
}
182
177
183
- fn create_context_nbr_test2 ( ) -> Context {
178
+ fn create_exports_nbr_test ( ) -> HashMap < i32 , Export > {
184
179
// Create this export: Map(
185
180
// 1 -> Export(/ -> "any", FoldHood(0) -> 1, FoldHood(0) / Nbr(0) -> 1),
186
181
// 2 -> Export(/ -> "any", FoldHood(0) -> 2, FoldHood(0) / Nbr(0) -> 2)
187
182
// )
188
- let mut export_dev_1: HashMap < Path , Box < dyn Any > > = HashMap :: new ( ) ;
189
- export_dev_1. insert ( Path :: from ( vec ! [ ] ) , Box :: new ( "any" ) ) ;
190
- export_dev_1. insert ( Path :: from ( vec ! [ FoldHood ( 0 ) ] ) , Box :: new ( 1 ) ) ;
191
- export_dev_1. insert ( Path :: from ( vec ! [ FoldHood ( 0 ) , Nbr ( 0 ) ] ) , Box :: new ( 1 ) ) ;
192
- let mut export_dev_2: HashMap < Path , Box < dyn Any > > = HashMap :: new ( ) ;
193
- export_dev_2. insert ( Path :: from ( vec ! [ ] ) , Box :: new ( "any" ) ) ;
194
- export_dev_2. insert ( Path :: from ( vec ! [ FoldHood ( 0 ) ] ) , Box :: new ( 2 ) ) ;
195
- export_dev_2. insert ( Path :: from ( vec ! [ FoldHood ( 0 ) , Nbr ( 0 ) ] ) , Box :: new ( 2 ) ) ;
183
+ let export_dev_1 = export ! ( ( path!( ) , "any" ) , ( path!( FoldHood ( 0 ) ) , 1 ) , ( path!( FoldHood ( 0 ) , Nbr ( 0 ) ) , 1 ) ) ;
184
+ let export_dev_2 = export ! ( ( path!( ) , "any" ) , ( path!( FoldHood ( 0 ) ) , 2 ) , ( path!( FoldHood ( 0 ) , Nbr ( 0 ) ) , 2 ) ) ;
196
185
let mut exports: HashMap < i32 , Export > = HashMap :: new ( ) ;
197
- exports. insert ( 1 , Export :: from ( export_dev_1) ) ;
198
- exports. insert ( 2 , Export :: from ( export_dev_2) ) ;
199
- // Context of the device
200
- let context = Context :: new ( 0 , Default :: default ( ) , Default :: default ( ) , exports) ;
201
- context
186
+ exports. insert ( 1 , export_dev_1) ;
187
+ exports. insert ( 2 , export_dev_2) ;
188
+ exports
202
189
}
203
190
204
191
#[ test]
@@ -219,11 +206,9 @@ mod test {
219
206
}
220
207
221
208
fn create_exports_rep_test ( ) -> HashMap < i32 , Export > {
222
- let mut export_dev_0: HashMap < Path , Box < dyn Any > > = HashMap :: new ( ) ;
223
- export_dev_0. insert ( Path :: from ( vec ! [ Rep ( 0 ) ] ) , Box :: new ( 7 ) ) ;
209
+ let export_dev_0= export ! ( ( path!( Rep ( 0 ) ) , 7 ) ) ;
224
210
let mut exports: HashMap < i32 , Export > = HashMap :: new ( ) ;
225
- exports. insert ( 0 , Export :: from ( export_dev_0) ) ;
226
- // print!("{:?}", exports.get(&0).unwrap().get::<i32>(&Path::from(vec![Rep(0)])));
211
+ exports. insert ( 0 , export_dev_0) ;
227
212
exports
228
213
}
229
214
@@ -253,32 +238,9 @@ mod test {
253
238
}
254
239
255
240
fn create_exports_branch_test ( ) -> HashMap < i32 , Export > {
256
- let mut export_dev_0: HashMap < Path , Box < dyn Any > > = HashMap :: new ( ) ;
257
- export_dev_0. insert ( Path :: from ( vec ! [ Rep ( 0 ) ] ) , Box :: new ( 1 ) ) ;
241
+ let export_dev_0= export ! ( ( path!( Rep ( 0 ) ) , 1 ) ) ;
258
242
let mut exports: HashMap < i32 , Export > = HashMap :: new ( ) ;
259
- exports. insert ( 0 , Export :: from ( export_dev_0) ) ;
243
+ exports. insert ( 0 , export_dev_0) ;
260
244
exports
261
245
}
262
-
263
- #[ test]
264
- fn test_sense ( ) {
265
- let context = Context :: new ( 0 , create_local_sensors ( ) , Default :: default ( ) , Default :: default ( ) ) ;
266
- // let result = round(init_with_ctx(context), |vm| sense(vm, |vm1, a| (vm1, a)));
267
- }
268
-
269
- fn create_local_sensors ( ) -> HashMap < SensorId , Box < dyn Any > > {
270
- // Sensors: Map("a" -> 7, "b" -> "high")
271
- let mut sensors: HashMap < SensorId , Box < dyn Any > > = HashMap :: new ( ) ;
272
- sensors. insert ( SensorId :: new ( "a" . to_string ( ) ) , Box :: new ( 7 ) ) ;
273
- sensors. insert ( SensorId :: new ( "b" . to_string ( ) ) , Box :: new ( "high" ) ) ;
274
- sensors
275
- }
276
-
277
-
278
-
279
- // Export: Map(
280
- // 1 -> Export(FoldHood(0) -> 1)
281
- // 2 -> Export(FoldHood(0) -> 2)
282
- // )
283
- // Program: foldhood(1)(_+_)(sense("a"))
284
246
}
0 commit comments