Source file test_iterator.ml
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
open! Base
open Base_quickcheck.Export
open Expect_test_helpers_base
module Iterator = Trie.Iterator
let test iter_m ~f:seq_of_string =
require_does_not_raise [%here] (fun () ->
Base_quickcheck.Test.run_exn
~config:{ Base_quickcheck.Test.default_config with test_count = 100 }
(module struct
type t = string [@@deriving quickcheck, sexp_of]
end)
~f:(fun string ->
let seq = seq_of_string string in
let round_trip_string =
let rec loop iter acc =
if Iterator.is_finished iter_m iter seq
then String.of_char_list (List.rev acc)
else
loop
(Iterator.next_exn iter_m iter seq)
(Iterator.get_exn iter_m iter seq :: acc)
in
loop (Iterator.start iter_m seq) []
in
require_equal [%here] (module String) string round_trip_string))
;;
let%test_module _ =
(module (
struct
module type Impl0 = Iterator.Impl0
module type Impl1 = Iterator.Impl1
module type Listable0 = Iterator.Listable0
module type Listable1 = Iterator.Listable1
module type S0 = Iterator.S0
module type S1 = Iterator.S1
type ('iter, 'seq, 'elt, 'idx) t = ('iter, 'seq, 'elt, 'idx) Iterator.t
(** accessors are uninteresting *)
let start = Iterator.start
let is_finished = Iterator.is_finished
let get_exn = Iterator.get_exn
let next_exn = Iterator.next_exn
(** type conversion is uninteresting **)
module Monomorphic = Iterator.Monomorphic
module Make1 = Iterator.Make1
let%expect_test "Make1" =
let module M =
Make1 (struct
type 'a seq = 'a array
type 'a elt = 'a
type _ t = int
let start _ = 0
let is_finished pos array = pos >= Array.length array
let get_exn pos array = array.(pos)
let next_exn pos _ = pos + 1
end)
in
test M.iterator ~f:String.to_array;
[%expect {| |}]
;;
module Make0 = Iterator.Make0
let%expect_test "Make0" =
let module M =
Make0 (struct
type seq = bytes
type elt = char
type t = int
let start _ = 0
let is_finished pos array = pos >= Bytes.length array
let get_exn pos array = Bytes.get array pos
let next_exn pos _ = pos + 1
end)
in
test M.iterator ~f:Bytes.of_string;
[%expect {| |}]
;;
module Of_listable1 = Iterator.Of_listable1
let%expect_test "Of_listable1" =
let module M =
Of_listable1 (struct
include Array
type 'a elt = 'a
end)
in
test M.iterator ~f:String.to_array;
[%expect {| |}]
;;
module Of_listable0 = Iterator.Of_listable0
let%expect_test "Of_listable0" =
let module M =
Of_listable0 (struct
include Bytes
type elt = char
end)
in
test M.iterator ~f:Bytes.of_string;
[%expect {| |}]
;;
module Of_list = Iterator.Of_list
let%expect_test "Of_list" =
test Of_list.iterator ~f:String.to_list;
[%expect {| |}]
;;
module Of_string = Iterator.Of_string
let%expect_test "Of_string" =
test Of_string.iterator ~f:Fn.id;
[%expect {| |}]
;;
end :
module type of Iterator))
;;