/
nv-lang
/
nova
Обзор
Документация
Войти
/
nv-lang
/
nova
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
main
std/src/testing/property_test.nv
111 строк
4 KB
Evgeniy Golovin
style(225.1): вертикальный ритм — sweep классов a-e (std/src)
26 июл 2026, 02:46
26 июл 2026, 02:46
38ecf16
Код
Авторство
О чём код?
// std/testing/property_test.nv — tests for property-based testing // (property.nv, test-conventions §тесты-рядом-в-пир-файле: single-file // module `testing.property` → отдельный пир-модуль `testing.property_test`, // импортирующий публичную поверхность — тот же паттерн, что // `checksums/crc32_test.nv`/`checksums.crc32_test`). module testing.property_test import std.testing.property import std.testing.handlers as th // ────────────────────────────────────────────────────────────────────────── // Тесты // ────────────────────────────────────────────────────────────────────────── // Простейший property — обращение списка дважды даёт исходный. test "reverse-reverse == identity для []int" { with Random = th.seeded(42) { ro gen = ArrayGen.default(IntGen.default()) property(gen, |xs| { ro twice = xs.reverse().reverse() assert_prop(twice == xs) }) } } // Idempotence sort'а. test "sort idempotent для []int" { with Random = th.seeded(42) { ro gen = ArrayGen.default(IntGen.default()) property(gen, |xs| { mut once = xs.clone() once.sort() mut twice = once.clone() twice.sort() assert_prop(once == twice) }) } } // Длина после concat = сумма длин. test "len(a + b) == len(a) + len(b) для []int" { with Random = th.seeded(123) { ro gen = ArrayGen.default(IntGen.default()) property(gen, |xs| { ro ys = xs.reverse() // любой второй массив ro combined = xs + ys assert_prop(combined.len() == xs.len() + ys.len()) }) } } // String concat ассоциативен. test "string concat associative" { with Random = th.seeded(7) { ro gen = StrGen.default() property(gen, |s| { ro combined1 = (s + s) + s ro combined2 = s + (s + s) assert_prop(combined1 == combined2) }) } } // Bool: !!x == x. test "double negation для bool" { with Random = th.seeded(1) { ro gen = BoolGen.new() property(gen, |b| { assert_prop(!!b == b) }) } } // Демо shrinking: специально падающий test ловит min failing input. // Условие «все элементы массива положительные» нарушается легко — // runner найдёт массив с одним отрицательным элементом и шринкнет // его до минимального ([0]) или ([-1]). test "shrinking демо: ищем минимальный counterexample" { ro gen = ArrayGen.default(IntGen.new(-100, 100)) mut caught = false mut min_size = 9999 with Random = th.seeded(99) { with Fail[PropertyFailed] = |e| interrupt () { property(gen, |xs| { // Намеренно ложное свойство: «все элементы > 0» mut all_pos = true for x in xs { if x <= 0 { all_pos = false } } assert_prop(all_pos) }) // Если property не упал — это bug в нашем демо caught = false } // Если property упал — handler сработал, caught остаётся false // здесь, но runner шринкнул до минимального counterexample. // (Не можем тут проверить min_size без захвата xs, поэтому // просто проверяем что shrinking запустился.) caught = true } assert(caught) }