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.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/problem-specifications/exercises/isbn-verifier/canonical-data.json +3 -3
- data/tracks/c/docs/C_STYLE_GUIDE.md +23 -0
- data/tracks/erlang/config.json +10 -0
- data/tracks/erlang/exercises/custom-set/README.md +54 -0
- data/tracks/erlang/exercises/custom-set/include/exercism.hrl +11 -0
- data/tracks/erlang/exercises/custom-set/rebar.config +30 -0
- data/tracks/erlang/exercises/custom-set/src/custom_set.app.src +9 -0
- data/tracks/erlang/exercises/custom-set/src/custom_set.erl +27 -0
- data/tracks/erlang/exercises/custom-set/src/example.erl +51 -0
- data/tracks/erlang/exercises/custom-set/test/custom_set_tests.erl +188 -0
- data/tracks/erlang/testgen/src/tgen_custom-set.erl +98 -0
- data/tracks/haskell/config.json +11 -0
- data/tracks/haskell/exercises/perfect-numbers/README.md +78 -0
- data/tracks/haskell/exercises/perfect-numbers/examples/success-standard/package.yaml +16 -0
- data/tracks/haskell/exercises/perfect-numbers/examples/success-standard/src/PerfectNumbers.hs +10 -0
- data/tracks/haskell/exercises/perfect-numbers/package.yaml +20 -0
- data/tracks/haskell/exercises/perfect-numbers/src/PerfectNumbers.hs +6 -0
- data/tracks/haskell/exercises/perfect-numbers/stack.yaml +1 -0
- data/tracks/haskell/exercises/perfect-numbers/test/Tests.hs +79 -0
- data/tracks/javascript/exercises/acronym/README.md +1 -1
- data/tracks/javascript/exercises/all-your-base/README.md +1 -1
- data/tracks/javascript/exercises/allergies/README.md +1 -1
- data/tracks/javascript/exercises/alphametics/README.md +1 -1
- data/tracks/javascript/exercises/anagram/README.md +1 -1
- data/tracks/javascript/exercises/atbash-cipher/README.md +1 -1
- data/tracks/javascript/exercises/beer-song/README.md +1 -1
- data/tracks/javascript/exercises/binary-search-tree/README.md +1 -1
- data/tracks/javascript/exercises/binary-search/README.md +1 -1
- data/tracks/javascript/exercises/binary/README.md +1 -1
- data/tracks/javascript/exercises/bob/README.md +1 -1
- data/tracks/javascript/exercises/bowling/README.md +1 -1
- data/tracks/javascript/exercises/bracket-push/README.md +1 -1
- data/tracks/javascript/exercises/change/README.md +1 -1
- data/tracks/javascript/exercises/circular-buffer/README.md +1 -1
- data/tracks/javascript/exercises/clock/README.md +1 -1
- data/tracks/javascript/exercises/collatz-conjecture/README.md +1 -1
- data/tracks/javascript/exercises/crypto-square/README.md +1 -1
- data/tracks/javascript/exercises/custom-set/README.md +1 -1
- data/tracks/javascript/exercises/diamond/README.md +1 -1
- data/tracks/javascript/exercises/difference-of-squares/README.md +1 -1
- data/tracks/javascript/exercises/diffie-hellman/README.md +1 -1
- data/tracks/javascript/exercises/etl/README.md +1 -1
- data/tracks/javascript/exercises/flatten-array/README.md +1 -1
- data/tracks/javascript/exercises/food-chain/README.md +1 -1
- data/tracks/javascript/exercises/gigasecond/README.md +1 -1
- data/tracks/javascript/exercises/grade-school/README.md +1 -1
- data/tracks/javascript/exercises/grains/README.md +1 -1
- data/tracks/javascript/exercises/hamming/README.md +1 -1
- data/tracks/javascript/exercises/hello-world/README.md +1 -1
- data/tracks/javascript/exercises/hexadecimal/README.md +1 -1
- data/tracks/javascript/exercises/isogram/README.md +1 -1
- data/tracks/javascript/exercises/kindergarten-garden/README.md +1 -1
- data/tracks/javascript/exercises/largest-series-product/README.md +1 -1
- data/tracks/javascript/exercises/leap/README.md +1 -1
- data/tracks/javascript/exercises/linked-list/README.md +1 -1
- data/tracks/javascript/exercises/list-ops/README.md +1 -1
- data/tracks/javascript/exercises/luhn/README.md +1 -1
- data/tracks/javascript/exercises/matrix/README.md +1 -1
- data/tracks/javascript/exercises/meetup/README.md +1 -1
- data/tracks/javascript/exercises/minesweeper/README.md +1 -1
- data/tracks/javascript/exercises/nth-prime/README.md +1 -1
- data/tracks/javascript/exercises/nucleotide-count/README.md +1 -1
- data/tracks/javascript/exercises/ocr-numbers/README.md +1 -1
- data/tracks/javascript/exercises/octal/README.md +1 -1
- data/tracks/javascript/exercises/palindrome-products/README.md +1 -1
- data/tracks/javascript/exercises/pangram/README.md +1 -1
- data/tracks/javascript/exercises/pascals-triangle/README.md +1 -1
- data/tracks/javascript/exercises/perfect-numbers/README.md +1 -1
- data/tracks/javascript/exercises/phone-number/README.md +1 -1
- data/tracks/javascript/exercises/pig-latin/README.md +1 -1
- data/tracks/javascript/exercises/point-mutations/README.md +1 -1
- data/tracks/javascript/exercises/prime-factors/README.md +1 -1
- data/tracks/javascript/exercises/protein-translation/README.md +1 -1
- data/tracks/javascript/exercises/proverb/README.md +1 -1
- data/tracks/javascript/exercises/pythagorean-triplet/README.md +1 -1
- data/tracks/javascript/exercises/queen-attack/README.md +1 -1
- data/tracks/javascript/exercises/raindrops/README.md +1 -1
- data/tracks/javascript/exercises/rna-transcription/README.md +1 -1
- data/tracks/javascript/exercises/robot-name/README.md +1 -1
- data/tracks/javascript/exercises/robot-simulator/README.md +1 -1
- data/tracks/javascript/exercises/roman-numerals/README.md +1 -1
- data/tracks/javascript/exercises/run-length-encoding/README.md +1 -1
- data/tracks/javascript/exercises/saddle-points/README.md +1 -1
- data/tracks/javascript/exercises/say/README.md +1 -1
- data/tracks/javascript/exercises/scrabble-score/README.md +1 -1
- data/tracks/javascript/exercises/secret-handshake/README.md +1 -1
- data/tracks/javascript/exercises/series/README.md +1 -1
- data/tracks/javascript/exercises/sieve/README.md +1 -1
- data/tracks/javascript/exercises/simple-cipher/README.md +1 -1
- data/tracks/javascript/exercises/simple-linked-list/README.md +1 -1
- data/tracks/javascript/exercises/space-age/README.md +1 -1
- data/tracks/javascript/exercises/strain/README.md +1 -1
- data/tracks/javascript/exercises/sum-of-multiples/README.md +1 -1
- data/tracks/javascript/exercises/transpose/README.md +1 -1
- data/tracks/javascript/exercises/triangle/README.md +1 -1
- data/tracks/javascript/exercises/trinary/README.md +1 -1
- data/tracks/javascript/exercises/twelve-days/README.md +1 -1
- data/tracks/javascript/exercises/two-bucket/README.md +1 -1
- data/tracks/javascript/exercises/word-count/README.md +1 -1
- data/tracks/javascript/exercises/wordy/README.md +1 -1
- data/tracks/javascript/exercises/zipper/README.md +1 -1
- data/tracks/typescript/config.json +15 -1
- data/tracks/typescript/exercises/pythagorean-triplet/README.md +54 -0
- data/tracks/typescript/exercises/pythagorean-triplet/package.json +36 -0
- data/tracks/typescript/exercises/pythagorean-triplet/pythagorean-triplet.example.ts +60 -0
- data/tracks/typescript/exercises/pythagorean-triplet/pythagorean-triplet.test.ts +37 -0
- data/tracks/typescript/exercises/pythagorean-triplet/pythagorean-triplet.ts +0 -0
- data/tracks/typescript/exercises/pythagorean-triplet/tsconfig.json +22 -0
- data/tracks/typescript/exercises/pythagorean-triplet/tslint.json +127 -0
- data/tracks/typescript/exercises/pythagorean-triplet/yarn.lock +2624 -0
- metadata +25 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ed67c6391790bb62b8a9b5d6aafee1d403f8bd34
|
4
|
+
data.tar.gz: 415063bcd0265caa42ae9ba5c03d4fd13004b8e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 261c39ecf0b278418a1df105613968e7f5761f939e13faabc30aca95e4499847caf64165936348b7a369bb6252366851c2168ec1358c35bb32bb608fa1b55fec
|
7
|
+
data.tar.gz: fcd9d3385a1629daf5294a467872046ea879d1ccf8e2c2e6176dfff322f44bc33872c7e961f8c10d8070108fd509326647cc8f39687c729faa1ff8ac3f4a4e9b
|
data/lib/trackler/version.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"exercise": "isbn-verifier",
|
3
|
-
"version": "1.
|
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-
|
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-
|
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.
|
data/tracks/erlang/config.json
CHANGED
@@ -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,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]))).
|