169 похожих чатов

Всем привет! Решаю 99 OCaml Problems и столкнулся со следующей

проблемой (прошу палками не забивать, я OCaml практически не трогал до этого момента):
open OUnit2


let create_test_case (type a b) (f: a -> b) name (expect : b) (args : a) =
name >:: (fun _ -> assert_equal ~printer:(Printf.sprintf "%s") expect (f args))

let create_test_suite name cases =
name ^ " test suite" >::: cases

(* Interface for task tests. *)
module type Task = sig
val test_suite : test
end

(* Generic test runner. *)
module TaskRunner = struct
let run tasks =
List.iter (fun (module T : Task) -> run_test_tt_main T.test_suite) tasks
end

(* Write a function [last : 'a list -> 'a option] that returns the last element of a list. *)
module Task01 : Task = struct
let rec last = function
| [] -> None
| [x] -> Some x
| _ :: t -> last t

let test_case = create_test_case last

let test_suite = create_test_suite "first"
[
test_case "no elements" None ([]);
test_case "single element" (Some 42) ([42]);
test_case "multiple elements" (Some 5) ([1; 2; 3; 4; 5]);
]
end

(* ... *)

let _ =
TaskRunner.run
[
(module Task01); (module Task02); (module Task03); (module Task04); (module Task05);
(module Task06); (module Task07); (module Task08); (module Task09); (module Task10);
]
Все круто и классно - работает. Как видно в TaskRunner.run, на самом деле модулей у меня куда больше, и есть проблема: когда какой-нибудь test_case падает - я получаю "not equal" и ничего более. Мне бы хотелось увидеть какой-нибудь diff, хотя бы. Из моих попыток нагуглить - я выяснил, что для каждого типа нужно писать либо свой string_of_t вариант, либо использовать ppx_* для автогенерации форматирования. В моем случае, используются простые списки из примитивных типов. Неужели язык не предоставляет для них форматтеров? Извините, если кого-то религиозно (в плане языка) задену, но в Rust'е мне достаточно сделать assert_eq!(a, b) и оно мне все по феншую разложит, ибо там под капотом у почти всех типов стандартной библиотеки реализованы Eq и ToString трейты для удобства.

2 ответов

28 просмотров

нет, в окамле такое не реализовано по-умолчанию

OUnit2 давно не использовал, но в Alcotest есть реализация testable для всех основных типов (testable реализует отображение и сравнение для типа) и возможность их комбинирования типа list option int. Но да, их все равно нужно явно указывать.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта