From 262f161f42c4e59beec41c6f440336c38385426a Mon Sep 17 00:00:00 2001 From: Marc Coquand Date: Wed, 20 Dec 2023 20:46:00 -0600 Subject: Initial commit --- lib/fixture.ml | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 lib/fixture.ml (limited to 'lib/fixture.ml') diff --git a/lib/fixture.ml b/lib/fixture.ml new file mode 100644 index 0000000..31a6e9c --- /dev/null +++ b/lib/fixture.ml @@ -0,0 +1,109 @@ +let names = + [ "Alice" + ; "Bob" + ; "Charlie" + ; "Dave" + ; "Eve" + ; "Frank" + ; "Grace" + ; "Heidi" + ; "Ivan" + ; "Judy" + ; "Mallory" + ; "Oscar" + ; "Peggy" + ; "Sybil" + ; "Trent" + ; "Victor" + ; "Walter" + ] + + +let random_name () = List.nth names (Random.int (List.length names)) +let%test "random_name" = List.mem (random_name ()) names + +type t = + | Name of string + | Uuidv4 of string + | Foreign of (string * string list) +(* (Name, foreign ids to pick from) *) + +let add_name name fixtures = Name name :: fixtures +let add_uuid uuid fixtures = Uuidv4 uuid :: fixtures +let add_foreign id values fixtures = Foreign (id, values) :: fixtures +let random_value_in_list values = List.nth values (Random.int (List.length values)) + +let%test "random_value_in_list" = + let values = [ "a"; "b"; "c" ] in + let result = random_value_in_list values in + List.mem result values + + +let generate_fixture fixture = + match fixture with + | Name _ -> random_name () + | Uuidv4 _ -> Uuidm.v `V4 |> Uuidm.to_string + | Foreign (_, reference) -> random_value_in_list reference + + +let%test "generate_uuid" = + generate_fixture (Uuidv4 "some_id") != generate_fixture (Uuidv4 "some_id") + + +let id_of_fixture fixture = + match fixture with + | Name id -> id + | Uuidv4 id -> id + | Foreign (id, _) -> id + + +let rec replicate element n = + match n with + | 0 -> [] + | n -> element :: replicate element (n - 1) + + +let compile fixtures ~amount = + let identifiers = List.map id_of_fixture fixtures in + let values = replicate fixtures amount |> List.map (List.map generate_fixture) in + identifiers :: values + + +let%test "create" = + let defs = compile [ Uuidv4 "id"; Name "name" ] ~amount:2 in + match defs with + | [ [ "id"; "name" ]; [ _; _ ]; [ _; _ ] ] -> true + | _ -> false + + +let get_id foreign_fixture = + match String.split_on_char '.' foreign_fixture with + | [ _; id ] -> Ok id + | _ -> Error "Not a foreign fixture" + + +let rec csv_of_string_list strs = + match strs with + | [] -> "" + | str :: [] -> str + | str :: rest -> str ^ "," ^ csv_of_string_list rest + + +let find_entries_for_header str_fixtures str = + match str_fixtures with + | [] -> Error "No fixtures" + | header :: rest -> + let maybe_index = List.find_index (fun s -> s = str) header in + (match maybe_index with + | Some index -> Ok (List.map (fun row -> List.nth row index) rest) + | None -> Error ("Could not find header: " ^ str ^ " in " ^ csv_of_string_list header)) + + +let csv_of_generated_fixtures fixtures = + let of_strings = List.map csv_of_string_list fixtures in + String.concat "\n" of_strings + + +let%test "csv_of_generated_fixtures" = + let result = [ [ "id"; "name" ]; [ "1234"; "John" ] ] |> csv_of_generated_fixtures in + result = "id,name\n1234,John" -- cgit v1.2.3