Verify polymorphic updates, name hygiene, and configuration combinations

This commit is contained in:
sneeker committed 2019-04-24 12:12:03 +00:00
1 parent 7c10887385
commit 46cde28b41
3 files changed
+71

No files matched your search

+62
View File
@@ -0,0 +1,62 @@
module Parameter = struct
type 'a t = { value : 'a; label : string } [@@fieldglass generate]
end
module Private = struct
type t = private { value : int }
[@@fieldglass generate ~no_set ~no_update ~no_lens]
let read : t -> int = value
end
module Universal = struct
type t = { apply : 'a. 'a -> 'a }
[@@fieldglass generate ~no_set ~no_update ~no_lens]
end
module Flags = struct
type t = { count : int }
[@@fieldglass generate ~no_get:false ~no_set:false ~no_update:false
~no_lens:false ~just_lens:false ~self_arg_first:false
~field_prefix_from_type:false ~func_no_named_arg:false]
end
module Group = struct
type left = { count : int } [@@fieldglass generate ~get_prefix:read]
and right = { size : int } [@@fieldglass generate ~field_prefix_from_type]
end
module Names = struct
type t = { __fg_source : int; __fg_value : string; __fg_function : bool }
[@@fieldglass generate ~field_prefix:local]
end
module Alias = struct
type original = { number : int; label : string }
type t = original = { number : int; label : string } [@@fieldglass generate]
end
module Unmarked = struct
type t = { number : int }
let number _ = 99
end
let () =
let original = Parameter.{ value = 3; label = "grey" } in
let changed = Parameter.set_value "three" original in
assert (changed = Parameter.{ value = "three"; label = "grey" });
assert (Parameter.update_value ~f:string_of_int original = Parameter.{ value = "3"; label = "grey" });
assert (Fieldglass.set Parameter._value "three" original = changed);
let identity = Universal.{ apply = fun value -> value } in
assert (Universal.apply identity 3 = 3);
assert (Universal.apply identity "grey" = "grey");
let count = Flags.{ count = 3 } in
assert (Flags.count (Flags.set_count 4 count) = 4);
assert (Flags.count (Flags.update_count ~f:succ count) = 4);
assert (Fieldglass.view Flags._count count = 3);
assert (Group.read_left_count Group.{ count = 3 } = 3);
assert (Group.read_right_size Group.{ size = 4 } = 4);
let names = Names.{ __fg_source = 3; __fg_value = "grey"; __fg_function = true } in
assert (Names.local_source names = 3);
assert (Names.local_value (Names.set_local_value "blue" names) = "blue");
assert (Alias.number (Alias.set_number 4 Alias.{ number = 3; label = "grey" }) = 4);
assert (Unmarked.number Unmarked.{ number = 3 } = 99)