1
1
namespace TOMBLib . Tests . CodeGen ;
2
2
3
+ using System . Collections . Generic ;
4
+ using System . Linq ;
5
+ using NUnit . Framework ;
6
+ using Phantasma . Core . Cryptography . Structs ;
7
+ using Phantasma . Core . Domain ;
8
+ using Phantasma . Core . Domain . Execution . Enums ;
9
+ using Phantasma . Core . Domain . VM ;
10
+ using Phantasma . Core . Utils ;
11
+ using Phantasma . Tomb . Compilers ;
12
+
3
13
public class CodeGeneratorTests
4
- {
5
-
14
+ {
15
+ [ Test ]
16
+ public void AutoCasts ( )
17
+ {
18
+ var sourceCode =
19
+ @"
20
+ contract test {
21
+ import Address;
22
+
23
+ public castTest(x:address): string {
24
+ return Address.toString(x);
25
+ }
26
+ }" ;
27
+
28
+ var parser = new TombLangCompiler ( ) ;
29
+ var contract = parser . Process ( sourceCode ) . First ( ) ;
30
+
31
+ var storage = new Dictionary < byte [ ] , byte [ ] > ( new ByteArrayComparer ( ) ) ;
32
+
33
+ var cast = contract . abi . FindMethod ( "castTest" ) ;
34
+ Assert . IsNotNull ( cast ) ;
35
+
36
+ var expected = "P2K7GyVMC3f9XxKRji5gfg91WvutoHs2RyB6KzQxuaAUUeo" ;
37
+ var addr = Address . FromText ( expected ) ;
38
+
39
+ var vm = new TestVM ( contract , storage , cast ) ;
40
+ vm . Stack . Push ( VMObject . FromObject ( addr ) ) ;
41
+ var result = vm . Execute ( ) ;
42
+ Assert . IsTrue ( result == ExecutionState . Halt ) ;
43
+
44
+ Assert . IsTrue ( vm . Stack . Count == 1 ) ;
45
+ var val = vm . Stack . Pop ( ) . AsString ( ) ;
46
+ Assert . IsTrue ( val == expected ) ;
47
+ }
48
+
49
+ [ Test ]
50
+ public void IfWithOr ( )
51
+ {
52
+ var sourceCode =
53
+ @"
54
+ contract test {
55
+ public check(x:number, y:number): bool {
56
+ return (x > 0) && (y < 0);
57
+ }
58
+ }" ;
59
+
60
+ var parser = new TombLangCompiler ( ) ;
61
+ var contract = parser . Process ( sourceCode ) . First ( ) ;
62
+
63
+ var storage = new Dictionary < byte [ ] , byte [ ] > ( new ByteArrayComparer ( ) ) ;
64
+
65
+ var countStuff = contract . abi . FindMethod ( "check" ) ;
66
+ Assert . IsNotNull ( countStuff ) ;
67
+
68
+ var vm = new TestVM ( contract , storage , countStuff ) ;
69
+ // NOTE - due to using a stack, we're pushing the second argument first (y), then the first argument (y)
70
+ vm . Stack . Push ( VMObject . FromObject ( - 3 ) ) ;
71
+ vm . Stack . Push ( VMObject . FromObject ( 3 ) ) ;
72
+ var result = vm . Execute ( ) ;
73
+ Assert . IsTrue ( result == ExecutionState . Halt ) ;
74
+
75
+ Assert . IsTrue ( vm . Stack . Count == 1 ) ;
76
+ var val = vm . Stack . Pop ( ) . AsBool ( ) ;
77
+ Assert . IsTrue ( val ) ;
78
+
79
+ vm = new TestVM ( contract , storage , countStuff ) ;
80
+ // NOTE - here we invert the order, in this case should fail due to the condition in the contract inside check()
81
+ vm . Stack . Push ( VMObject . FromObject ( 3 ) ) ;
82
+ vm . Stack . Push ( VMObject . FromObject ( - 3 ) ) ;
83
+ result = vm . Execute ( ) ;
84
+ Assert . IsTrue ( result == ExecutionState . Halt ) ;
85
+
86
+ Assert . IsTrue ( vm . Stack . Count == 1 ) ;
87
+ val = vm . Stack . Pop ( ) . AsBool ( ) ;
88
+ Assert . IsFalse ( val ) ;
89
+ }
6
90
}
0 commit comments