trackler 2.2.1.58 → 2.2.1.59

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/isbn-verifier/canonical-data.json +3 -3
  4. data/tracks/c/docs/C_STYLE_GUIDE.md +23 -0
  5. data/tracks/erlang/config.json +10 -0
  6. data/tracks/erlang/exercises/custom-set/README.md +54 -0
  7. data/tracks/erlang/exercises/custom-set/include/exercism.hrl +11 -0
  8. data/tracks/erlang/exercises/custom-set/rebar.config +30 -0
  9. data/tracks/erlang/exercises/custom-set/src/custom_set.app.src +9 -0
  10. data/tracks/erlang/exercises/custom-set/src/custom_set.erl +27 -0
  11. data/tracks/erlang/exercises/custom-set/src/example.erl +51 -0
  12. data/tracks/erlang/exercises/custom-set/test/custom_set_tests.erl +188 -0
  13. data/tracks/erlang/testgen/src/tgen_custom-set.erl +98 -0
  14. data/tracks/haskell/config.json +11 -0
  15. data/tracks/haskell/exercises/perfect-numbers/README.md +78 -0
  16. data/tracks/haskell/exercises/perfect-numbers/examples/success-standard/package.yaml +16 -0
  17. data/tracks/haskell/exercises/perfect-numbers/examples/success-standard/src/PerfectNumbers.hs +10 -0
  18. data/tracks/haskell/exercises/perfect-numbers/package.yaml +20 -0
  19. data/tracks/haskell/exercises/perfect-numbers/src/PerfectNumbers.hs +6 -0
  20. data/tracks/haskell/exercises/perfect-numbers/stack.yaml +1 -0
  21. data/tracks/haskell/exercises/perfect-numbers/test/Tests.hs +79 -0
  22. data/tracks/javascript/exercises/acronym/README.md +1 -1
  23. data/tracks/javascript/exercises/all-your-base/README.md +1 -1
  24. data/tracks/javascript/exercises/allergies/README.md +1 -1
  25. data/tracks/javascript/exercises/alphametics/README.md +1 -1
  26. data/tracks/javascript/exercises/anagram/README.md +1 -1
  27. data/tracks/javascript/exercises/atbash-cipher/README.md +1 -1
  28. data/tracks/javascript/exercises/beer-song/README.md +1 -1
  29. data/tracks/javascript/exercises/binary-search-tree/README.md +1 -1
  30. data/tracks/javascript/exercises/binary-search/README.md +1 -1
  31. data/tracks/javascript/exercises/binary/README.md +1 -1
  32. data/tracks/javascript/exercises/bob/README.md +1 -1
  33. data/tracks/javascript/exercises/bowling/README.md +1 -1
  34. data/tracks/javascript/exercises/bracket-push/README.md +1 -1
  35. data/tracks/javascript/exercises/change/README.md +1 -1
  36. data/tracks/javascript/exercises/circular-buffer/README.md +1 -1
  37. data/tracks/javascript/exercises/clock/README.md +1 -1
  38. data/tracks/javascript/exercises/collatz-conjecture/README.md +1 -1
  39. data/tracks/javascript/exercises/crypto-square/README.md +1 -1
  40. data/tracks/javascript/exercises/custom-set/README.md +1 -1
  41. data/tracks/javascript/exercises/diamond/README.md +1 -1
  42. data/tracks/javascript/exercises/difference-of-squares/README.md +1 -1
  43. data/tracks/javascript/exercises/diffie-hellman/README.md +1 -1
  44. data/tracks/javascript/exercises/etl/README.md +1 -1
  45. data/tracks/javascript/exercises/flatten-array/README.md +1 -1
  46. data/tracks/javascript/exercises/food-chain/README.md +1 -1
  47. data/tracks/javascript/exercises/gigasecond/README.md +1 -1
  48. data/tracks/javascript/exercises/grade-school/README.md +1 -1
  49. data/tracks/javascript/exercises/grains/README.md +1 -1
  50. data/tracks/javascript/exercises/hamming/README.md +1 -1
  51. data/tracks/javascript/exercises/hello-world/README.md +1 -1
  52. data/tracks/javascript/exercises/hexadecimal/README.md +1 -1
  53. data/tracks/javascript/exercises/isogram/README.md +1 -1
  54. data/tracks/javascript/exercises/kindergarten-garden/README.md +1 -1
  55. data/tracks/javascript/exercises/largest-series-product/README.md +1 -1
  56. data/tracks/javascript/exercises/leap/README.md +1 -1
  57. data/tracks/javascript/exercises/linked-list/README.md +1 -1
  58. data/tracks/javascript/exercises/list-ops/README.md +1 -1
  59. data/tracks/javascript/exercises/luhn/README.md +1 -1
  60. data/tracks/javascript/exercises/matrix/README.md +1 -1
  61. data/tracks/javascript/exercises/meetup/README.md +1 -1
  62. data/tracks/javascript/exercises/minesweeper/README.md +1 -1
  63. data/tracks/javascript/exercises/nth-prime/README.md +1 -1
  64. data/tracks/javascript/exercises/nucleotide-count/README.md +1 -1
  65. data/tracks/javascript/exercises/ocr-numbers/README.md +1 -1
  66. data/tracks/javascript/exercises/octal/README.md +1 -1
  67. data/tracks/javascript/exercises/palindrome-products/README.md +1 -1
  68. data/tracks/javascript/exercises/pangram/README.md +1 -1
  69. data/tracks/javascript/exercises/pascals-triangle/README.md +1 -1
  70. data/tracks/javascript/exercises/perfect-numbers/README.md +1 -1
  71. data/tracks/javascript/exercises/phone-number/README.md +1 -1
  72. data/tracks/javascript/exercises/pig-latin/README.md +1 -1
  73. data/tracks/javascript/exercises/point-mutations/README.md +1 -1
  74. data/tracks/javascript/exercises/prime-factors/README.md +1 -1
  75. data/tracks/javascript/exercises/protein-translation/README.md +1 -1
  76. data/tracks/javascript/exercises/proverb/README.md +1 -1
  77. data/tracks/javascript/exercises/pythagorean-triplet/README.md +1 -1
  78. data/tracks/javascript/exercises/queen-attack/README.md +1 -1
  79. data/tracks/javascript/exercises/raindrops/README.md +1 -1
  80. data/tracks/javascript/exercises/rna-transcription/README.md +1 -1
  81. data/tracks/javascript/exercises/robot-name/README.md +1 -1
  82. data/tracks/javascript/exercises/robot-simulator/README.md +1 -1
  83. data/tracks/javascript/exercises/roman-numerals/README.md +1 -1
  84. data/tracks/javascript/exercises/run-length-encoding/README.md +1 -1
  85. data/tracks/javascript/exercises/saddle-points/README.md +1 -1
  86. data/tracks/javascript/exercises/say/README.md +1 -1
  87. data/tracks/javascript/exercises/scrabble-score/README.md +1 -1
  88. data/tracks/javascript/exercises/secret-handshake/README.md +1 -1
  89. data/tracks/javascript/exercises/series/README.md +1 -1
  90. data/tracks/javascript/exercises/sieve/README.md +1 -1
  91. data/tracks/javascript/exercises/simple-cipher/README.md +1 -1
  92. data/tracks/javascript/exercises/simple-linked-list/README.md +1 -1
  93. data/tracks/javascript/exercises/space-age/README.md +1 -1
  94. data/tracks/javascript/exercises/strain/README.md +1 -1
  95. data/tracks/javascript/exercises/sum-of-multiples/README.md +1 -1
  96. data/tracks/javascript/exercises/transpose/README.md +1 -1
  97. data/tracks/javascript/exercises/triangle/README.md +1 -1
  98. data/tracks/javascript/exercises/trinary/README.md +1 -1
  99. data/tracks/javascript/exercises/twelve-days/README.md +1 -1
  100. data/tracks/javascript/exercises/two-bucket/README.md +1 -1
  101. data/tracks/javascript/exercises/word-count/README.md +1 -1
  102. data/tracks/javascript/exercises/wordy/README.md +1 -1
  103. data/tracks/javascript/exercises/zipper/README.md +1 -1
  104. data/tracks/typescript/config.json +15 -1
  105. data/tracks/typescript/exercises/pythagorean-triplet/README.md +54 -0
  106. data/tracks/typescript/exercises/pythagorean-triplet/package.json +36 -0
  107. data/tracks/typescript/exercises/pythagorean-triplet/pythagorean-triplet.example.ts +60 -0
  108. data/tracks/typescript/exercises/pythagorean-triplet/pythagorean-triplet.test.ts +37 -0
  109. data/tracks/typescript/exercises/pythagorean-triplet/pythagorean-triplet.ts +0 -0
  110. data/tracks/typescript/exercises/pythagorean-triplet/tsconfig.json +22 -0
  111. data/tracks/typescript/exercises/pythagorean-triplet/tslint.json +127 -0
  112. data/tracks/typescript/exercises/pythagorean-triplet/yarn.lock +2624 -0
  113. metadata +25 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: aa66c91549abb0087fdc23e6f042092222585ec6
4
- data.tar.gz: '043992d475673db6aad726d94da4b8539323e471'
3
+ metadata.gz: ed67c6391790bb62b8a9b5d6aafee1d403f8bd34
4
+ data.tar.gz: 415063bcd0265caa42ae9ba5c03d4fd13004b8e2
5
5
  SHA512:
6
- metadata.gz: 64ca07c7338c0c3167adee155b8956f0fa1aa17f1ad0eb51c1626f3818d4405aeb5e16b7fe7438820de2440ec4bbca0261dc7f2081db9f438885e550d5646f59
7
- data.tar.gz: 0e932c6b1405d8a573873a75ff4f78bacde1799292f57b23c27fcef8c041460c9a635785b5bd5461a821ee54806ecd18e1ce60992dad14fce79f74e6bb939561
6
+ metadata.gz: 261c39ecf0b278418a1df105613968e7f5761f939e13faabc30aca95e4499847caf64165936348b7a369bb6252366851c2168ec1358c35bb32bb608fa1b55fec
7
+ data.tar.gz: fcd9d3385a1629daf5294a467872046ea879d1ccf8e2c2e6176dfff322f44bc33872c7e961f8c10d8070108fd509326647cc8f39687c729faa1ff8ac3f4a4e9b
@@ -1,3 +1,3 @@
1
1
  module Trackler
2
- VERSION = "2.2.1.58"
2
+ VERSION = "2.2.1.59"
3
3
  end
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "exercise": "isbn-verifier",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "comments": [
5
5
  "An expected value of true indicates a valid ISBN-10, ",
6
6
  "whereas false means the ISBN-10 is invalid."
@@ -39,7 +39,7 @@
39
39
  {
40
40
  "description": "X is only valid as a check digit",
41
41
  "property": "isbn",
42
- "input": "3-598-2X507-0",
42
+ "input": "3-598-2X507-9",
43
43
  "expected": false
44
44
  },
45
45
  {
@@ -75,7 +75,7 @@
75
75
  {
76
76
  "description": "too long isbn",
77
77
  "property": "isbn",
78
- "input": "3-598-21507-XA",
78
+ "input": "3-598-21507-XX",
79
79
  "expected": false
80
80
  },
81
81
  {
@@ -122,6 +122,29 @@ void tearDown(void)
122
122
 
123
123
  Next are the test functions themselves.
124
124
  The names of these functions use a `test_` prefix.
125
+ Excepting the first, each test function should have `TEST_IGNORE();` as its first statement.
126
+ The first occurrence of this should be followed by the line comment `// delete this line to run test`.
127
+ For example:
128
+
129
+ ```c
130
+ void test_the_first(void)
131
+ {
132
+ test_first_foo();
133
+ }
134
+
135
+ void test_the_second(void)
136
+ {
137
+ TEST_IGNORE(); // delete this line to run test
138
+ test_second_foo();
139
+ }
140
+
141
+ void test_the_third(void)
142
+ {
143
+ TEST_IGNORE();
144
+ char grade = 'A';
145
+ test_third_foo(grade);
146
+ }
147
+ ```
125
148
 
126
149
  Last in the file is the `main()` function.
127
150
  The function body of main follows a particular layout itself.
@@ -372,6 +372,16 @@
372
372
 
373
373
  ]
374
374
  },
375
+ {
376
+ "uuid": "453aad9b-044e-473e-87c1-0193afb2cb13",
377
+ "slug": "custom-set",
378
+ "core": false,
379
+ "unlocked_by": null,
380
+ "difficulty": 6,
381
+ "topics": [
382
+
383
+ ]
384
+ },
375
385
  {
376
386
  "uuid": "249d0c9f-dadc-4168-ba9b-0c6bfe83618d",
377
387
  "slug": "meetup",
@@ -0,0 +1,54 @@
1
+ # Custom Set
2
+
3
+ Create a custom set type.
4
+
5
+ Sometimes it is necessary to define a custom data structure of some
6
+ type, like a set. In this exercise you will define your own set. How it
7
+ works internally doesn't matter, as long as it behaves like a set of
8
+ unique elements.
9
+
10
+ ## Running tests
11
+
12
+ In order to run the tests, issue the following command from the exercise
13
+ directory:
14
+
15
+ For running the tests provided, `rebar3` is used as it is the official build and
16
+ dependency management tool for erlang now. Please refer to [the tracks installation
17
+ instructions](http://exercism.io/languages/erlang/installation) on how to do that.
18
+
19
+ In order to run the tests, you can issue the following command from the exercise
20
+ directory.
21
+
22
+ ```bash
23
+ $ rebar3 eunit
24
+ ```
25
+
26
+ ### Test versioning
27
+
28
+ Each problem defines a macro `TEST_VERSION` in the test file and
29
+ verifies that the solution defines and exports a function `test_version`
30
+ returning that same value.
31
+
32
+ To make tests pass, add the following to your solution:
33
+
34
+ ```erlang
35
+ -export([test_version/0]).
36
+
37
+ test_version() ->
38
+ 1.
39
+ ```
40
+
41
+ The benefit of this is that reviewers can see against which test version
42
+ an iteration was written if, for example, a previously posted solution
43
+ does not solve the current problem or passes current tests.
44
+
45
+ ## Questions?
46
+
47
+ For detailed information about the Erlang track, please refer to the
48
+ [help page](http://exercism.io/languages/erlang) on the Exercism site.
49
+ This covers the basic information on setting up the development
50
+ environment expected by the exercises.
51
+
52
+
53
+ ## Submitting Incomplete Solutions
54
+ It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -0,0 +1,11 @@
1
+ -include_lib("eunit/include/eunit.hrl").
2
+
3
+ sut(Module) ->
4
+ {ok, Files} = file:list_dir("./src"),
5
+ case lists:member("example.erl", Files) of
6
+ true -> example;
7
+ false -> Module
8
+ end.
9
+
10
+ version_test() ->
11
+ ?assertMatch(?TEST_VERSION, ?TESTED_MODULE:test_version()).
@@ -0,0 +1,30 @@
1
+ %% Erlang compiler options
2
+ {erl_opts, [debug_info]}.
3
+
4
+ {deps, []}.
5
+
6
+ {dialyzer, [
7
+ {warnings, [underspecs, no_return]},
8
+ {get_warnings, true},
9
+ {plt_apps, top_level_deps}, % top_level_deps | all_deps
10
+ {plt_extra_apps, []},
11
+ {plt_location, local}, % local | "/my/file/name"
12
+ {plt_prefix, "rebar3"},
13
+ {base_plt_apps, [stdlib, kernel, crypto]},
14
+ {base_plt_location, global}, % global | "/my/file/name"
15
+ {base_plt_prefix, "rebar3"}
16
+ ]}.
17
+
18
+ %% eunit:test(Tests)
19
+ {eunit_tests, []}.
20
+ %% Options for eunit:test(Tests, Opts)
21
+ {eunit_opts, [verbose]}.
22
+
23
+ %% == xref ==
24
+
25
+ {xref_warnings, true}.
26
+
27
+ %% xref checks to run
28
+ {xref_checks, [undefined_function_calls, undefined_functions,
29
+ locals_not_used, exports_not_used,
30
+ deprecated_function_calls, deprecated_functions]}.
@@ -0,0 +1,9 @@
1
+ {application, custom_set,
2
+ [{description, "exercism.io - custom-set"},
3
+ {vsn, "0.0.1"},
4
+ {modules, []},
5
+ {registered, []},
6
+ {applications, [kernel,
7
+ stdlib]},
8
+ {env, []}
9
+ ]}.
@@ -0,0 +1,27 @@
1
+ -module(custom_set).
2
+
3
+ -export([add/2, contains/2, difference/2, disjoint/2, empty/1, equal/2, from_list/1, intersection/2, subset/2,
4
+ union/2, test_version/0]).
5
+
6
+
7
+ add(Elem, Set) -> undefined.
8
+
9
+ contains(Elem, Set) -> undefined.
10
+
11
+ difference(Set1, Set2) -> undefined.
12
+
13
+ disjoint(Set1, Set2) -> undefined.
14
+
15
+ empty(Set) -> undefined.
16
+
17
+ equal(Set1, Set2) -> undefined.
18
+
19
+ from_list(List) -> undefined.
20
+
21
+ intersection(Set1, Set2) -> undefined.
22
+
23
+ subset(Set1, Set2) -> undefined.
24
+
25
+ union(Set1, Set2) -> undefined.
26
+
27
+ test_version() -> 1.
@@ -0,0 +1,51 @@
1
+ -module(example).
2
+
3
+ -export([add/2, contains/2, difference/2, disjoint/2, empty/1, equal/2, from_list/1, intersection/2, subset/2,
4
+ union/2, test_version/0]).
5
+
6
+ -record(set, {s = #{}}).
7
+
8
+ add(Elem, #set{s = S}) ->
9
+ #set{s = maps:put(Elem, true, S)}.
10
+
11
+ contains(Elem, #set{s = S}) ->
12
+ maps:is_key(Elem, S).
13
+
14
+ difference(#set{s = S1}, #set{s = S2}) ->
15
+ #set{s = lists:foldl(
16
+ fun (E, S) -> maps:remove(E, S) end, S1, maps:keys(S2))}.
17
+
18
+ disjoint(Set1, Set2) ->
19
+ empty(intersection(Set1, Set2)).
20
+
21
+ empty(#set{s = S}) ->
22
+ maps:size(S) =:= 0.
23
+
24
+ equal(Set1, Set2) ->
25
+ Set1 == Set2.
26
+
27
+ from_list(List) ->
28
+ #set{s = from_list(List, #{})}.
29
+
30
+ from_list([], Acc) -> Acc;
31
+ from_list([E|List], Acc) ->
32
+ from_list(List, maps:put(E, true, Acc)).
33
+
34
+ intersection(#set{s = S1}, #set{s = S2}) ->
35
+ #set{s = lists:foldl(
36
+ fun (E, S) ->
37
+ case maps:is_key(E, S2) of
38
+ true -> maps:put(E, true, S);
39
+ false -> S
40
+ end
41
+ end, #{}, maps:keys(S1))}.
42
+
43
+ subset(#set{s = S1}, #set{s = S2}) ->
44
+ lists:all(
45
+ fun (E) -> maps:is_key(E, S2) end,
46
+ maps:keys(S1)).
47
+
48
+ union(#set{s = S1}, #set{s = S2}) ->
49
+ #set{s = maps:merge(S1, S2)}.
50
+
51
+ test_version() -> 1.
@@ -0,0 +1,188 @@
1
+ -module(custom_set_tests).
2
+
3
+ % This file is automatically generated from the exercises canonical data.
4
+
5
+ -define(TESTED_MODULE, (sut(custom_set))).
6
+ -define(TEST_VERSION, 1).
7
+ -include("exercism.hrl").
8
+
9
+
10
+ sets_with_no_elements_are_empty_test() ->
11
+ ?assert(?TESTED_MODULE:empty(?TESTED_MODULE:from_list([]))).
12
+
13
+ sets_with_elements_are_not_empty_test() ->
14
+ ?assertNot(?TESTED_MODULE:empty(?TESTED_MODULE:from_list([1]))).
15
+
16
+ nothing_is_contained_in_an_empty_set_test() ->
17
+ ?assertNot(?TESTED_MODULE:contains(1,
18
+ ?TESTED_MODULE:from_list([]))).
19
+
20
+ when_the_element_is_in_the_set_test() ->
21
+ ?assert(?TESTED_MODULE:contains(1,
22
+ ?TESTED_MODULE:from_list([1, 2, 3]))).
23
+
24
+ when_the_element_is_not_in_the_set_test() ->
25
+ ?assertNot(?TESTED_MODULE:contains(4,
26
+ ?TESTED_MODULE:from_list([1, 2, 3]))).
27
+
28
+ empty_set_is_a_subset_of_another_empty_set_test() ->
29
+ ?assert(?TESTED_MODULE:subset(?TESTED_MODULE:from_list([]),
30
+ ?TESTED_MODULE:from_list([]))).
31
+
32
+ empty_set_is_a_subset_of_non_empty_set_test() ->
33
+ ?assert(?TESTED_MODULE:subset(?TESTED_MODULE:from_list([]),
34
+ ?TESTED_MODULE:from_list([1]))).
35
+
36
+ non_empty_set_is_not_a_subset_of_empty_set_test() ->
37
+ ?assertNot(?TESTED_MODULE:subset(?TESTED_MODULE:from_list([1]),
38
+ ?TESTED_MODULE:from_list([]))).
39
+
40
+ set_is_a_subset_of_set_with_exact_same_elements_test() ->
41
+ ?assert(?TESTED_MODULE:subset(?TESTED_MODULE:from_list([1,
42
+ 2, 3]),
43
+ ?TESTED_MODULE:from_list([1, 2, 3]))).
44
+
45
+ set_is_a_subset_of_larger_set_with_same_elements_test() ->
46
+ ?assert(?TESTED_MODULE:subset(?TESTED_MODULE:from_list([1,
47
+ 2, 3]),
48
+ ?TESTED_MODULE:from_list([4, 1, 2, 3]))).
49
+
50
+ set_is_not_a_subset_of_set_that_does_not_contain_its_elements_test() ->
51
+ ?assertNot(?TESTED_MODULE:subset(?TESTED_MODULE:from_list([1,
52
+ 2, 3]),
53
+ ?TESTED_MODULE:from_list([4, 1, 3]))).
54
+
55
+ the_empty_set_is_disjoint_with_itself_test() ->
56
+ ?assert(?TESTED_MODULE:disjoint(?TESTED_MODULE:from_list([]),
57
+ ?TESTED_MODULE:from_list([]))).
58
+
59
+ empty_set_is_disjoint_with_non_empty_set_test() ->
60
+ ?assert(?TESTED_MODULE:disjoint(?TESTED_MODULE:from_list([]),
61
+ ?TESTED_MODULE:from_list([1]))).
62
+
63
+ non_empty_set_is_disjoint_with_empty_set_test() ->
64
+ ?assert(?TESTED_MODULE:disjoint(?TESTED_MODULE:from_list([1]),
65
+ ?TESTED_MODULE:from_list([]))).
66
+
67
+ sets_are_not_disjoint_if_they_share_an_element_test() ->
68
+ ?assertNot(?TESTED_MODULE:disjoint(?TESTED_MODULE:from_list([1,
69
+ 2]),
70
+ ?TESTED_MODULE:from_list([2, 3]))).
71
+
72
+ sets_are_disjoint_if_they_share_no_elements_test() ->
73
+ ?assert(?TESTED_MODULE:disjoint(?TESTED_MODULE:from_list([1,
74
+ 2]),
75
+ ?TESTED_MODULE:from_list([3, 4]))).
76
+
77
+ empty_sets_are_equal_test() ->
78
+ ?assert(?TESTED_MODULE:equal(?TESTED_MODULE:from_list([]),
79
+ ?TESTED_MODULE:from_list([]))).
80
+
81
+ empty_set_is_not_equal_to_non_empty_set_test() ->
82
+ ?assertNot(?TESTED_MODULE:equal(?TESTED_MODULE:from_list([]),
83
+ ?TESTED_MODULE:from_list([1, 2, 3]))).
84
+
85
+ non_empty_set_is_not_equal_to_empty_set_test() ->
86
+ ?assertNot(?TESTED_MODULE:equal(?TESTED_MODULE:from_list([1,
87
+ 2, 3]),
88
+ ?TESTED_MODULE:from_list([]))).
89
+
90
+ sets_with_the_same_elements_are_equal_test() ->
91
+ ?assert(?TESTED_MODULE:equal(?TESTED_MODULE:from_list([1,
92
+ 2]),
93
+ ?TESTED_MODULE:from_list([2, 1]))).
94
+
95
+ sets_with_different_elements_are_not_equal_test() ->
96
+ ?assertNot(?TESTED_MODULE:equal(?TESTED_MODULE:from_list([1,
97
+ 2, 3]),
98
+ ?TESTED_MODULE:from_list([1, 2, 4]))).
99
+
100
+ add_to_empty_set_test() ->
101
+ ?assertEqual(?TESTED_MODULE:from_list([3]),
102
+ ?TESTED_MODULE:add(3, ?TESTED_MODULE:from_list([]))).
103
+
104
+ add_to_non_empty_set_test() ->
105
+ ?assertEqual(?TESTED_MODULE:from_list([1, 2, 3, 4]),
106
+ ?TESTED_MODULE:add(3,
107
+ ?TESTED_MODULE:from_list([1, 2, 4]))).
108
+
109
+ adding_an_existing_element_does_not_change_the_set_test() ->
110
+ ?assertEqual(?TESTED_MODULE:from_list([1, 2, 3]),
111
+ ?TESTED_MODULE:add(3,
112
+ ?TESTED_MODULE:from_list([1, 2, 3]))).
113
+
114
+ intersection_of_two_empty_sets_is_an_empty_set_test() ->
115
+ ?assertEqual(?TESTED_MODULE:from_list([]),
116
+ ?TESTED_MODULE:intersection(?TESTED_MODULE:from_list([]),
117
+ ?TESTED_MODULE:from_list([]))).
118
+
119
+ intersection_of_an_empty_set_and_non_empty_set_is_an_empty_set_test() ->
120
+ ?assertEqual(?TESTED_MODULE:from_list([]),
121
+ ?TESTED_MODULE:intersection(?TESTED_MODULE:from_list([]),
122
+ ?TESTED_MODULE:from_list([3, 2,
123
+ 5]))).
124
+
125
+ intersection_of_a_non_empty_set_and_an_empty_set_is_an_empty_set_test() ->
126
+ ?assertEqual(?TESTED_MODULE:from_list([]),
127
+ ?TESTED_MODULE:intersection(?TESTED_MODULE:from_list([1,
128
+ 2, 3,
129
+ 4]),
130
+ ?TESTED_MODULE:from_list([]))).
131
+
132
+ intersection_of_two_sets_with_no_shared_elements_is_an_empty_set_test() ->
133
+ ?assertEqual(?TESTED_MODULE:from_list([]),
134
+ ?TESTED_MODULE:intersection(?TESTED_MODULE:from_list([1,
135
+ 2, 3]),
136
+ ?TESTED_MODULE:from_list([4, 5,
137
+ 6]))).
138
+
139
+ intersection_of_two_sets_with_shared_elements_is_a_set_of_the_shared_elements_test() ->
140
+ ?assertEqual(?TESTED_MODULE:from_list([2, 3]),
141
+ ?TESTED_MODULE:intersection(?TESTED_MODULE:from_list([1,
142
+ 2, 3,
143
+ 4]),
144
+ ?TESTED_MODULE:from_list([3, 2,
145
+ 5]))).
146
+
147
+ difference_of_two_empty_sets_is_an_empty_set_test() ->
148
+ ?assertEqual(?TESTED_MODULE:from_list([]),
149
+ ?TESTED_MODULE:difference(?TESTED_MODULE:from_list([]),
150
+ ?TESTED_MODULE:from_list([]))).
151
+
152
+ difference_of_empty_set_and_non_empty_set_is_an_empty_set_test() ->
153
+ ?assertEqual(?TESTED_MODULE:from_list([]),
154
+ ?TESTED_MODULE:difference(?TESTED_MODULE:from_list([]),
155
+ ?TESTED_MODULE:from_list([3, 2,
156
+ 5]))).
157
+
158
+ difference_of_a_non_empty_set_and_an_empty_set_is_the_non_empty_set_test() ->
159
+ ?assertEqual(?TESTED_MODULE:from_list([1, 2, 3, 4]),
160
+ ?TESTED_MODULE:difference(?TESTED_MODULE:from_list([1,
161
+ 2, 3, 4]),
162
+ ?TESTED_MODULE:from_list([]))).
163
+
164
+ difference_of_two_non_empty_sets_is_a_set_of_elements_that_are_only_in_the_first_set_test() ->
165
+ ?assertEqual(?TESTED_MODULE:from_list([1, 3]),
166
+ ?TESTED_MODULE:difference(?TESTED_MODULE:from_list([3,
167
+ 2, 1]),
168
+ ?TESTED_MODULE:from_list([2, 4]))).
169
+
170
+ union_of_empty_sets_is_an_empty_set_test() ->
171
+ ?assertEqual(?TESTED_MODULE:from_list([]),
172
+ ?TESTED_MODULE:union(?TESTED_MODULE:from_list([]),
173
+ ?TESTED_MODULE:from_list([]))).
174
+
175
+ union_of_an_empty_set_and_non_empty_set_is_the_non_empty_set_test() ->
176
+ ?assertEqual(?TESTED_MODULE:from_list([2]),
177
+ ?TESTED_MODULE:union(?TESTED_MODULE:from_list([]),
178
+ ?TESTED_MODULE:from_list([2]))).
179
+
180
+ union_of_a_non_empty_set_and_empty_set_is_the_non_empty_set_test() ->
181
+ ?assertEqual(?TESTED_MODULE:from_list([1, 3]),
182
+ ?TESTED_MODULE:union(?TESTED_MODULE:from_list([1, 3]),
183
+ ?TESTED_MODULE:from_list([]))).
184
+
185
+ union_of_non_empty_sets_contains_all_unique_elements_test() ->
186
+ ?assertEqual(?TESTED_MODULE:from_list([3, 2, 1]),
187
+ ?TESTED_MODULE:union(?TESTED_MODULE:from_list([1, 3]),
188
+ ?TESTED_MODULE:from_list([2, 3]))).