File: functor_tests.ml

package info (click to toggle)
ocaml-deriving-ocsigen 0.6.2-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 628 kB
  • ctags: 1,159
  • sloc: ml: 6,334; makefile: 63; sh: 18
file content (98 lines) | stat: -rw-r--r-- 2,997 bytes parent folder | download | duplicates (2)
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
open Tests_defs

let r1 =
  begin
    let map : r1 -> r1 = Functor_r1.map in
    let x = {r1_l1 = 2; r1_l2 = 12} in

    assert (map x = x);
  end

let intseq = 
  begin
    let map : intseq -> intseq = Functor_intseq.map in
    let i = ICons (0, ICons (1, ICons (2, INil))) in
      assert (map i = i);
  end

let seq =
  begin
    let map =
      let module M : sig val map : ('a -> 'b) -> 'a seq -> 'b seq end
        = struct let map = Functor_seq.map end in M.map in
      assert (map ((+)1) (Cons (1, Cons (2, Cons (3, Cons (4, Nil)))))
              = Cons (2, Cons (3, Cons (4, Cons (5, Nil)))));
  end

let poly7 =
  begin
    let map = 
      let module M : sig val map : ('a -> 'b) -> 'a poly7 -> 'b poly7 end
        = struct let map = Functor_poly7.map end in M.map in
      assert (map ((+)1) (Foo (`F 0)) = Foo (`F 1));
  end

let poly8 = 
  begin
    let map = 
      let module M : sig val map : ('a -> 'b) -> 'a poly8 -> 'b poly8 end
        = struct let map = Functor_poly8.map end in M.map in
      assert (map ((+)1)
                { x = `G (`H (`I (Foo (`F 0))))}
              = { x = `G (`H (`I (Foo (`F 1))))});
  end

let poly10 =
  begin
    let map : poly10 -> poly10 = Functor_poly10.map in
      assert (map `F = `F);
      assert (map (`Cons (1,`Cons (2, `Nil))) = (`Cons (1,`Cons (2, `Nil))));
  end

let pmutrec =
  begin
    let _ =
      let module M : sig val map : ('a -> 'b) -> ('c -> 'd) -> ('a,'c) pmutrec_a -> ('b,'d) pmutrec_a end 
        = struct let map = Functor_pmutrec_a.map end in M.map in
    let _ =
      let module M : sig val map : ('a -> 'b) -> ('c -> 'd) -> ('a,'c) pmutrec_b -> ('b,'d) pmutrec_b end 
        = struct let map = Functor_pmutrec_b.map end in M.map in
    let _ =
      let module M : sig val map : ('a -> 'b) -> ('c -> 'd) -> ('a,'c) pmutrec_c -> ('b,'d) pmutrec_c end 
        = struct let map = Functor_pmutrec_c.map end in M.map in
    let _ =
      let module M : sig val map : ('a -> 'b) -> ('c -> 'd) -> ('a,'c) pmutrec_d -> ('b,'d) pmutrec_d end 
        = struct let map = Functor_pmutrec_d.map end in M.map in
      ()
  end

let ff1 =
  begin
    let map = 
      let module M : sig val map : ('a -> 'b) -> 'a ff1 -> 'b ff1 end
        = struct let map = Functor_ff1.map end in M.map in
      assert (map ((+)1) (F (1,2)) = F (2,3));
      assert (map ((+)1) (G 3) = G 3);
  end

let ff2 = 
  begin
    let map f = 
      let module M : sig val map : ('a -> 'b) -> ('c -> 'd) -> ('a,'c) ff2 -> ('b,'d) ff2 end
        = struct let map = Functor_ff2.map end in M.map f in
      assert (map ((+)1) not (F1 (F2 (Cons (1,Cons (2, Nil)), 3, Some true)))
                = (F1 (F2 (Cons (2,Cons (3, Nil)), 3, Some false))));

      assert (map not ((+)1) (F1 (F2 (Cons (true,Nil), 3, Some 0)))
              =  (F1 (F2 (Cons (false,Nil), 3, Some 1))));
  end
      
(*
type 'a constrained = [`F of 'a] constraint 'a = int
*)

let t =
  begin
    let map : int -> int = Functor_t.map in
      assert (map 12 = 12);
  end