aboutsummaryrefslogtreecommitdiff
path: root/urm_test.ml
blob: bc3a0b8d5530cb22b6d6dc37835e9c1bc379df0a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
(*
 * UPEM / L3 / Functional programming / Project: URM
 * Pacien TRAN-GIRARD, Adam NAILI
 *)

open Common
open Instptr
open Urm
open Kaputt.Abbreviations

let sort_regs = List.sort (fun (Reg(l, _)) (Reg(r, _)) -> compare l r)

let () =
  Test.add_simple_test
    ~title:"example_urm_add_program"
    (fun () ->
       let input_prgm = [
         Zero 0;
         Zero 3;
         Jump (1, 3, 6);
         Succ 0;
         Succ 3;
         Jump (3, 3, 2);
         Zero 3;
         Jump (2, 3, 11);
         Succ 0;
         Succ 3;
         Jump (3, 3, 7)]
       and input_regs = [
         Reg (1, 2);
         Reg (2, 3)]
       and expected_urm = {
         instptr = InstPtr ([], [
           (0, Zero 0);
           (1, Zero 3);
           (2, Jump (1, 3, 6));
           (3, Succ 0);
           (4, Succ 3);
           (5, Jump (3, 3, 2));
           (6, Zero 3);
           (7, Jump (2, 3, 11));
           (8, Succ 0);
           (9, Succ 3);
           (10, Jump (3, 3, 7))]);
         regs = [
           Reg (1, 2);
           Reg (2, 3)]}
       and expected_output = [
         Reg (0, 5);
         Reg (1, 2);
         Reg (2, 3);
         Reg (3, 3)]
       in let output_prgm = urm_mk input_prgm input_regs
       in let output_regs = urm_run output_prgm
       in
         Assert.is_true (output_prgm = expected_urm);
         Assert.is_true ((sort_regs output_regs) = expected_output))

let () =
  Test.add_simple_test
    ~title:"example_urm_factorial_program"
    (fun () ->
       let input_prgm = [
         Zero 4;
         Jump (1, 4, 4);
         Zero 8;
         Jump (8, 8, 7);
         Succ 1;
         Zero 9;
         Jump (9, 9, 29);
         Copy (2, 1);
         Zero 1;
         Succ 1;
         Zero 3;
         Succ 3;
         Copy (5, 1);
         Zero 1;
         Zero 6;
         Jump (3, 6, 25);
         Zero 7;
         Jump (5, 7, 22);
         Succ 1;
         Succ 7;
         Zero 10;
         Jump (10, 10, 17);
         Succ 6;
         Zero 11;
         Jump (11, 11, 15);
         Jump (2, 3, 29);
         Succ 3;
         Zero 12;
         Jump (12, 12, 12);
         Zero 13;
         Jump (13, 13, 38)]
       and input_regs = [
         Reg (1, 5)]
       and expected_urm = {
         instptr = InstPtr ([], [
           (0, Zero 4);
           (1, Jump (1, 4, 4));
           (2, Zero 8);
           (3, Jump (8, 8, 7));
           (4, Succ 1);
           (5, Zero 9);
           (6, Jump (9, 9, 29));
           (7, Copy (2, 1));
           (8, Zero 1);
           (9, Succ 1);
           (10, Zero 3);
           (11, Succ 3);
           (12, Copy (5, 1));
           (13, Zero 1);
           (14, Zero 6);
           (15, Jump (3, 6, 25));
           (16, Zero 7);
           (17, Jump (5, 7, 22));
           (18, Succ 1);
           (19, Succ 7);
           (20, Zero 10);
           (21, Jump (10, 10, 17));
           (22, Succ 6);
           (23, Zero 11);
           (24, Jump (11, 11, 15));
           (25, Jump (2, 3, 29));
           (26, Succ 3);
           (27, Zero 12);
           (28, Jump (12, 12, 12));
           (29, Zero 13);
           (30, Jump (13, 13, 38))]);
         regs = [
           Reg (1, 5)]}
       and expected_output = [
         Reg (1, 120);
         Reg (2, 5);
         Reg (3, 5);
         Reg (4, 0);
         Reg (5, 24);
         Reg (6, 5);
         Reg (7, 24);
         Reg (8, 0);
         Reg (10, 0);
         Reg (11, 0);
         Reg (12, 0);
         Reg (13, 0)]
       in let output_prgm = urm_mk input_prgm input_regs
       in let output_regs = urm_run output_prgm
       in
         Assert.is_true (output_prgm = expected_urm);
         Assert.is_true ((sort_regs output_regs) = expected_output))

let () = if Array.mem "run-tests" Sys.argv then Test.launch_tests ()