aboutsummaryrefslogtreecommitdiff
path: root/aoc2023/build/packages/adglent/src/showtime/tests
diff options
context:
space:
mode:
Diffstat (limited to 'aoc2023/build/packages/adglent/src/showtime/tests')
-rw-r--r--aoc2023/build/packages/adglent/src/showtime/tests/meta.gleam3
-rw-r--r--aoc2023/build/packages/adglent/src/showtime/tests/should.gleam113
-rw-r--r--aoc2023/build/packages/adglent/src/showtime/tests/test.gleam57
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)
+}