trackler 2.2.1.58 → 2.2.1.59

Sign up to get free protection for your applications and to get access to all the features.
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]))).