aboutsummaryrefslogtreecommitdiffstats
path: root/test/infinite_relations_test.erl
diff options
context:
space:
mode:
authorMarcos Magueta <maguetamarcos@gmail.com>2025-11-22 22:32:04 -0300
committerGitHub <noreply@github.com>2025-11-22 22:32:04 -0300
commit09be36e5f5e2c5714b9542df8ccc363ab86ac6da (patch)
tree06105bcbcc8cacc70e977e2370af270ae713226e /test/infinite_relations_test.erl
parenta56ea3089524b440b12b660d36c07f46b4fd9eb3 (diff)
downloadSakura-09be36e5f5e2c5714b9542df8ccc363ab86ac6da.tar.gz
Sakura-09be36e5f5e2c5714b9542df8ccc363ab86ac6da.zip
Infinite relations (#10)
Diffstat (limited to '')
-rw-r--r--test/infinite_relations_test.erl147
1 files changed, 147 insertions, 0 deletions
diff --git a/test/infinite_relations_test.erl b/test/infinite_relations_test.erl
new file mode 100644
index 0000000..cafd325
--- /dev/null
+++ b/test/infinite_relations_test.erl
@@ -0,0 +1,147 @@
+-module(infinite_relations_test).
+-include_lib("eunit/include/eunit.hrl").
+-include("operations.hrl").
+
+%%% Test Suite for Infinite Relations
+
+infinite_relations_test_() ->
+ {foreach,
+ fun setup/0,
+ fun cleanup/1,
+ [
+ fun test_create_naturals/1,
+ fun test_naturals_with_constraints/1,
+ fun test_integers_generator/1,
+ fun test_rationals_generator/1,
+ fun test_take_operator/1,
+ fun test_finite_relation_cardinality/1
+ ]}.
+
+%%% Setup and Cleanup
+
+setup() ->
+ operations:setup(),
+ operations:create_database(test_db).
+
+cleanup(_DB) ->
+ ok.
+
+%%% Tests
+
+test_create_naturals(DB) ->
+ %% Create infinite relation of natural numbers
+ %% Domain relations have empty schemas (base case)
+ {DB1, Naturals} = operations:create_infinite_relation(DB, #{
+ name => naturals,
+ schema => #{},
+ cardinality => aleph_zero,
+ generator => {primitive, naturals},
+ constraints => #{value => {gte, 0}}
+ }),
+
+ [
+ ?_assert(is_record(Naturals, relation)),
+ ?_assertEqual(naturals, Naturals#relation.name),
+ ?_assertEqual(aleph_zero, Naturals#relation.cardinality),
+ ?_assertEqual({primitive, naturals}, Naturals#relation.generator)
+ ].
+
+test_naturals_with_constraints(DB) ->
+ %% Create naturals relation
+ {DB1, _Naturals} = operations:create_infinite_relation(DB, #{
+ name => naturals,
+ schema => #{},
+ cardinality => aleph_zero,
+ generator => {primitive, naturals},
+ constraints => #{value => {gte, 0}}
+ }),
+
+ %% Query with range constraint [0, 9]
+ Iterator = operations:get_tuples_iterator(DB1, naturals, #{value => {range, 0, 9}}),
+ Tuples = operations:collect_all(Iterator),
+
+ %% Should get exactly 10 tuples: {0, 1, 2, ..., 9}
+ [
+ ?_assertEqual(10, length(Tuples)),
+ ?_assert(lists:member(#{value => 0}, Tuples)),
+ ?_assert(lists:member(#{value => 5}, Tuples)),
+ ?_assert(lists:member(#{value => 9}, Tuples))
+ ].
+
+test_integers_generator(DB) ->
+ %% Create integers relation
+ {DB1, Integers} = operations:create_infinite_relation(DB, #{
+ name => integers,
+ schema => #{},
+ cardinality => aleph_zero,
+ generator => {primitive, integers}
+ }),
+
+ %% Query with range constraint [-5, 5]
+ Iterator = operations:get_tuples_iterator(DB1, integers, #{value => {range, -5, 5}}),
+ Tuples = operations:collect_all(Iterator),
+
+ %% Should get 11 tuples: {-5, -4, ..., 0, ..., 4, 5}
+ [
+ ?_assertEqual(aleph_zero, Integers#relation.cardinality),
+ ?_assertEqual(11, length(Tuples)),
+ ?_assert(lists:member(#{value => 0}, Tuples)),
+ ?_assert(lists:member(#{value => -5}, Tuples)),
+ ?_assert(lists:member(#{value => 5}, Tuples))
+ ].
+
+test_rationals_generator(DB) ->
+ %% Create rationals relation
+ {DB1, Rationals} = operations:create_infinite_relation(DB, #{
+ name => rationals,
+ schema => #{},
+ cardinality => aleph_zero,
+ generator => {primitive, rationals}
+ }),
+
+ %% Take first 10 rationals using constraints
+ Iterator = operations:get_tuples_iterator(DB1, rationals, #{}),
+
+ %% Just get a few tuples to verify generator works
+ {ok, First} = operations:next_tuple(Iterator),
+ {ok, Second} = operations:next_tuple(Iterator),
+ operations:close_iterator(Iterator),
+
+ [
+ ?_assertEqual(aleph_zero, Rationals#relation.cardinality),
+ ?_assert(is_map(First)),
+ ?_assert(maps:is_key(numerator, First)),
+ ?_assert(maps:is_key(denominator, First)),
+ ?_assert(is_map(Second))
+ ].
+
+test_take_operator(DB) ->
+ %% Create naturals
+ {DB1, _} = operations:create_infinite_relation(DB, #{
+ name => naturals,
+ schema => #{},
+ cardinality => aleph_zero,
+ generator => {primitive, naturals},
+ constraints => #{value => {gte, 0}}
+ }),
+
+ %% Take 100 naturals
+ {_DB2, Naturals100} = operations:take(DB1, naturals, 100),
+
+ %% Verify result is finite
+ [
+ ?_assertEqual({finite, 100}, Naturals100#relation.cardinality),
+ ?_assertEqual({take, naturals, 100}, Naturals100#relation.generator)
+ ].
+
+test_finite_relation_cardinality(DB) ->
+ %% Create finite relation
+ {DB1, _} = operations:create_relation(DB, users, #{name => string, age => integer}),
+
+ %% Add tuple
+ {DB2, UpdatedRel} = operations:create_tuple(DB1, users, #{name => "Alice", age => 30}),
+
+ %% Cardinality should be 1
+ [
+ ?_assertEqual({finite, 1}, UpdatedRel#relation.cardinality)
+ ].