diff options
Diffstat (limited to 'aoc2023/build/packages/adglent/src/showtime/tests')
3 files changed, 173 insertions, 0 deletions
diff --git a/aoc2023/build/packages/adglent/src/showtime/tests/meta.gleam b/aoc2023/build/packages/adglent/src/showtime/tests/meta.gleam new file mode 100644 index 0000000..cbba414 --- /dev/null +++ b/aoc2023/build/packages/adglent/src/showtime/tests/meta.gleam @@ -0,0 +1,3 @@ +pub type Meta { + Meta(description: String, tags: List(String)) +} diff --git a/aoc2023/build/packages/adglent/src/showtime/tests/should.gleam b/aoc2023/build/packages/adglent/src/showtime/tests/should.gleam new file mode 100644 index 0000000..71578c7 --- /dev/null +++ b/aoc2023/build/packages/adglent/src/showtime/tests/should.gleam @@ -0,0 +1,113 @@ +import gleam/option.{type Option, None, Some} +import showtime/tests/meta.{type Meta} + +pub type Assertion(t, e) { + Eq(a: t, b: t, meta: Option(Meta)) + NotEq(a: t, b: t, meta: Option(Meta)) + IsOk(a: Result(t, e), meta: Option(Meta)) + IsError(a: Result(t, e), meta: Option(Meta)) + Fail(meta: Option(Meta)) +} + +pub fn equal(a: t, b: t) { + evaluate(Eq(a, b, None)) +} + +pub fn equal_meta(a: t, b: t, meta: Meta) { + evaluate(Eq(a, b, Some(meta))) +} + +pub fn not_equal(a: t, b: t) { + evaluate(NotEq(a, b, None)) +} + +pub fn not_equal_meta(a: t, b: t, meta: Meta) { + evaluate(NotEq(a, b, Some(meta))) +} + +pub fn be_ok(a: Result(o, e)) { + evaluate(IsOk(a, None)) + let assert Ok(value) = a + value +} + +pub fn be_ok_meta(a: Result(o, e), meta: Meta) { + evaluate(IsOk(a, Some(meta))) +} + +pub fn be_error(a: Result(o, e)) { + evaluate(IsError(a, None)) + let assert Error(value) = a + value +} + +pub fn be_error_meta(a: Result(o, e), meta: Meta) { + evaluate(IsError(a, Some(meta))) +} + +pub fn fail() { + evaluate(Fail(None)) +} + +pub fn fail_meta(meta: Meta) { + evaluate(Fail(Some(meta))) +} + +pub fn be_true(a: Bool) { + a + |> equal(True) +} + +pub fn be_true_meta(a: Bool, meta: Meta) { + a + |> equal_meta(True, meta) +} + +pub fn be_false(a: Bool) { + a + |> equal(False) +} + +pub fn be_false_meta(a: Bool, meta: Meta) { + a + |> equal_meta(False, meta) +} + +@external(erlang, "showtime_ffi", "gleam_error") +fn gleam_error(value: Result(Nil, Assertion(a, b))) -> Nil + +pub fn evaluate(assertion) -> Nil { + case assertion { + Eq(a, b, _meta) -> + case a == b { + True -> Nil + False -> { + gleam_error(Error(assertion)) + } + } + NotEq(a, b, _meta) -> + case a != b { + True -> Nil + False -> { + gleam_error(Error(assertion)) + } + } + IsOk(a, _meta) -> + case a { + Ok(_) -> Nil + Error(_) -> { + gleam_error(Error(assertion)) + } + } + IsError(a, _meta) -> + case a { + Error(_) -> Nil + Ok(_) -> { + gleam_error(Error(assertion)) + } + } + Fail(_meta) -> { + gleam_error(Error(assertion)) + } + } +} diff --git a/aoc2023/build/packages/adglent/src/showtime/tests/test.gleam b/aoc2023/build/packages/adglent/src/showtime/tests/test.gleam new file mode 100644 index 0000000..730f943 --- /dev/null +++ b/aoc2023/build/packages/adglent/src/showtime/tests/test.gleam @@ -0,0 +1,57 @@ +import showtime/tests/should +import showtime/tests/meta.{type Meta} +import gleam/io + +pub type Test { + Test(meta: Meta, test_function: fn() -> Nil) +} + +pub type MetaShould(t) { + MetaShould(equal: fn(t, t) -> Nil, not_equal: fn(t, t) -> Nil) +} + +pub fn test(meta: Meta, test_function: fn(Meta) -> Nil) { + Test(meta, fn() { test_function(meta) }) +} + +pub fn with_meta(meta: Meta, test_function: fn(MetaShould(a)) -> Nil) { + Test( + meta, + fn() { + test_function(MetaShould( + fn(a, b) { equal(a, b, meta) }, + fn(a, b) { not_equal(a, b, meta) }, + )) + }, + ) +} + +pub fn equal(a: t, b: t, meta: Meta) { + io.debug(a) + io.debug(b) + should.equal_meta(a, b, meta) +} + +pub fn not_equal(a: t, b: t, meta: Meta) { + should.equal_meta(a, b, meta) +} + +pub fn be_ok(a: Result(o, e), meta: Meta) { + should.be_ok_meta(a, meta) +} + +pub fn be_error(a: Result(o, e), meta: Meta) { + should.be_error_meta(a, meta) +} + +pub fn fail(meta: Meta) { + should.fail_meta(meta) +} + +pub fn be_true(a: Bool, meta: Meta) { + should.be_true_meta(a, meta) +} + +pub fn be_false(a: Bool, meta: Meta) { + should.be_false_meta(a, meta) +} |