aboutsummaryrefslogtreecommitdiff
path: root/tests/sheet_test.ml
diff options
context:
space:
mode:
Diffstat (limited to 'tests/sheet_test.ml')
-rwxr-xr-xtests/sheet_test.ml136
1 files changed, 136 insertions, 0 deletions
diff --git a/tests/sheet_test.ml b/tests/sheet_test.ml
new file mode 100755
index 0000000..f63d76f
--- /dev/null
+++ b/tests/sheet_test.ml
@@ -0,0 +1,136 @@
+open OUnit2
+
+let u = UTF8.from_utf8string
+
+let _msg ~expected ~result =
+ Printf.sprintf "Expected %s but got %s"
+ (UTF8.encode @@ ScTypes.Result.show expected)
+ (UTF8.encode @@ ScTypes.Result.show result)
+
+(** Test a simple references between two cells *)
+let test_create_ref_1 ctx = begin
+
+ let s = Sheet.Raw.create
+ |> Sheet.Raw.add (3,3) @@ Expression.load @@ u"=-1"
+ |> snd |> Sheet.Raw.add (0,0) @@ Expression.load @@ u"=C3"
+ |> snd in
+ let result = (Sheet.Raw.get_value (0, 0) s) in
+ let expected = (ScTypes.Result (ScTypes.Num (Num.num_of_int (-1), Some (u"-1")))) in
+
+ assert_equal
+ ~msg:(_msg ~expected ~result)
+ expected
+ result
+end
+
+let test_create_ref_2 ctx = begin
+
+ let s = Sheet.Raw.create
+ |> Sheet.Raw.add (2,2) @@ Expression.load @@ u"=C3"
+ |> snd |> Sheet.Raw.add (3,3) @@ Expression.load @@ u"=A1"
+ |> snd |> Sheet.Raw.add (1,1) @@ Expression.load @@ u"123"
+ |> snd in
+
+
+ let result = (Sheet.Raw.get_value (2, 2) s) in
+ let expected = ScTypes.Result (ScTypes.Num (Num.num_of_int 123, Some (u"123"))) in
+
+ assert_equal
+ ~msg:(_msg ~expected ~result)
+ expected
+ result
+end
+
+let test_create_direct_cycle ctx = begin
+
+ let s = Sheet.Raw.create
+ |> Sheet.Raw.add (2,2) @@ Expression.load @@ u"=B2"
+ |> snd in
+ let result = (Sheet.Raw.get_value (2, 2) s) in
+ let expected = ScTypes.Error Sheet.Raw.Cycle in
+
+ assert_equal
+ ~msg:(_msg ~expected ~result)
+ expected
+ result
+end
+
+let test_create_indirect_cycle ctx = begin
+
+ let s = Sheet.Raw.create
+ |> Sheet.Raw.add (2,2) @@ Expression.load @@ u"=A1"
+ |> snd |> Sheet.Raw.add (1,1) @@ Expression.load @@ u"=B2"
+ |> snd |> Sheet.Raw.add (0,0) @@ Expression.load @@ u"=A1"
+ |> snd in
+ let result = (Sheet.Raw.get_value (0, 0) s) in
+ let expected = ScTypes.Result ScTypes.Undefined in
+
+ assert_equal
+ ~msg:(_msg ~expected ~result)
+ expected
+ result
+end
+
+let test_delete ctx = begin
+
+ let s = Sheet.Raw.create
+ |> Sheet.Raw.add (2,2) @@ Expression.load @@ u"=C3"
+ |> snd |> Sheet.Raw.add (3,3) @@ Expression.load @@ u"=A1"
+ |> snd |> Sheet.Raw.remove (2,2)
+ |> snd |> Sheet.Raw.remove (3,3)
+ |> snd in
+ let result = (Sheet.Raw.get_value (3, 3) s) in
+ let expected = ScTypes.Result ScTypes.Undefined in
+
+ assert_equal
+ ~msg:(_msg ~expected ~result)
+ expected
+ result
+end
+
+let test_update_succs1 ctx = begin
+
+ let result = Sheet.Raw.create
+ |> Sheet.Raw.add (1,1) @@ Expression.load @@ u" =1"
+ |> snd |> Sheet.Raw.add (2,2) @@ Expression.load @@ u"=A2"
+ |> snd |> Sheet.Raw.add (1,2) @@ Expression.load @@ u"=A1/1"
+ |> snd |> Sheet.Raw.add (1,1) @@ Expression.load @@ u"=2"
+ |> fst in
+
+ (* All the cells are updated by the change *)
+ let expected = Cell.Set.of_list [(1,1); (1, 2); (2,2)] in
+
+ let msg = Printf.sprintf "Expected %s but got %s"
+ (UTF8.encode @@ Tools.String.print_buffer Cell.Set.printb expected)
+ (UTF8.encode @@ Tools.String.print_buffer Cell.Set.printb result) in
+
+ assert_equal ~msg
+ expected
+ result
+end
+
+let test_update_succs2 ctx = begin
+
+ let result = Sheet.Raw.create
+ |> Sheet.Raw.add (1,1) @@ Expression.load @@ u"=1"
+ |> snd |> Sheet.Raw.add (2,2) @@ Expression.load @@ u"=A2"
+ |> snd |> Sheet.Raw.add (1,2) @@ Expression.load @@ u"=A1/0"
+ |> snd |> Sheet.Raw.add (1,1) @@ Expression.load @@ u"=2"
+ |> fst in
+ (* Only (1, 1) is updated ; (1, 2) does not change, neither (2, 2) *)
+ let expected = Cell.Set.of_list [(1,1)] in
+
+ assert_equal
+ expected
+ result
+end
+
+let tests = "sheet_test">::: [
+ "test_ref2" >:: test_create_ref_2;
+ "test_ref1" >:: test_create_ref_1;
+ "test_cycle1" >:: test_create_direct_cycle;
+ "test_cycle2" >:: test_create_indirect_cycle;
+ "test_delete" >:: test_delete;
+ "test_update_succs1" >:: test_update_succs1;
+ "test_update_succs2" >:: test_update_succs2;
+ ]