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 ответов

3 просмотра

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

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

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

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

#include <stdio.h> #include <stdlib.h> #include <time.h> void mass_first_generate(int mass[5][7]) {     for (int N = 0; N < 5; N++) {         for (int A = 0; A < 7; A++) {   ...
Чувак
6
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
возможно ли как-то передать в электрон или таури медиа поток с рендера 2д движка? двиг запускается как dll, а дальше надо как-то отправлять рендер кодировать не подходит, зр...
Kyle Nekto
7
https://www.linkedin.com/posts/ugama-benedicta-kelechi-codergirl-103041300_mobiledevelopment-fluttertraining-handsonlearning-activity-7263445699227254784-IdHB?utm_source=share...
CoderGirl
16
Помогите пожалуйста. Делаю систему плагинов. Проблема сейчас в такая: плагины загружаются в основном потоке. FLibHandle := SafeLoadLibrary(FFileName) Но нужно еще выполнить фу...
Илья 🤣
10
Ну вот просто даже давайте вот как. Какой нибудь конкретный кейс, можете в пример привести, где бч работает и приносит прикладную пользу, а не просто что бы было? Не крипту.
Alexander Andreev
22
объясните пожалуйста, почему функция не работает должным образом? вроде должно брать активное окно сравнивать его размер с размером экрана, и если есть совпадение = true прове...
JF
12
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
У меня вопрос попроще, почти нубский: нужно заставить сайт эво 1.4.34 перевести с PHP 7.4 на 8.2. Понятное дело, что дополнения обновить-проверить, а с основной системой как ...
Вячеслав Кузьменко
5
Доброго времени суток. Может кто подскажет, есть ли возможность в evo в одной админке иметь допустим 3 сайта на разных доменах? (domain1.ru, domain2.ru, domain3.ru). Если да, ...
Maxim Belsky
5
Карта сайта