trackler 2.1.0.11 → 2.1.0.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/bump-content +3 -3
- data/common/CONTRIBUTING.md +1 -0
- data/common/exercises/atbash-cipher/description.md +1 -1
- data/common/exercises/dominoes/canonical-data.json +2 -2
- data/common/exercises/robot-name/description.md +2 -3
- data/lib/trackler/version.rb +1 -1
- data/tracks/coq/.gitignore +3 -0
- data/tracks/coq/README.md +12 -14
- data/tracks/coq/config.json +18 -1
- data/tracks/coq/exercises/TRACK_HINTS.md +22 -0
- data/tracks/coq/exercises/hello-world/example.v +12 -0
- data/tracks/coq/exercises/hello-world/helloworld.v +3 -0
- data/tracks/coq/exercises/hello-world/metadata.yml +3 -0
- data/tracks/coq/exercises/hello-world/test.v +9 -0
- data/tracks/coq/exercises/rna-transcription/DNA.v +4 -0
- data/tracks/coq/exercises/rna-transcription/example.v +15 -0
- data/tracks/coq/exercises/rna-transcription/metadata.yml +3 -0
- data/tracks/coq/exercises/rna-transcription/rna-transcription.v +5 -0
- data/tracks/coq/exercises/tautology/description.md +1 -0
- data/tracks/coq/exercises/tautology/example.v +4 -0
- data/tracks/coq/exercises/tautology/metadata.yml +3 -0
- data/tracks/coq/exercises/tautology/tautology.v +4 -0
- data/tracks/ecmascript/.travis.yml +0 -1
- data/tracks/ecmascript/Makefile +1 -1
- data/tracks/ecmascript/README.md +4 -2
- data/tracks/ecmascript/exercises/accumulate/package.json +3 -3
- data/tracks/ecmascript/exercises/acronym/package.json +3 -3
- data/tracks/ecmascript/exercises/all-your-base/package.json +3 -3
- data/tracks/ecmascript/exercises/allergies/package.json +3 -3
- data/tracks/ecmascript/exercises/anagram/package.json +3 -3
- data/tracks/ecmascript/exercises/atbash-cipher/package.json +3 -3
- data/tracks/ecmascript/exercises/beer-song/package.json +3 -3
- data/tracks/ecmascript/exercises/binary-search-tree/package.json +3 -3
- data/tracks/ecmascript/exercises/binary-search/package.json +3 -3
- data/tracks/ecmascript/exercises/binary/package.json +3 -3
- data/tracks/ecmascript/exercises/bob/package.json +3 -3
- data/tracks/ecmascript/exercises/bracket-push/package.json +3 -3
- data/tracks/ecmascript/exercises/circular-buffer/package.json +3 -3
- data/tracks/ecmascript/exercises/clock/package.json +3 -3
- data/tracks/ecmascript/exercises/crypto-square/package.json +3 -3
- data/tracks/ecmascript/exercises/custom-set/package.json +3 -3
- data/tracks/ecmascript/exercises/diamond/package.json +3 -3
- data/tracks/ecmascript/exercises/difference-of-squares/package.json +3 -3
- data/tracks/ecmascript/exercises/etl/package.json +3 -3
- data/tracks/ecmascript/exercises/food-chain/package.json +3 -3
- data/tracks/ecmascript/exercises/gigasecond/package.json +3 -3
- data/tracks/ecmascript/exercises/grade-school/package.json +3 -3
- data/tracks/ecmascript/exercises/grains/package.json +3 -3
- data/tracks/ecmascript/exercises/hamming/package.json +3 -3
- data/tracks/ecmascript/exercises/hello-world/package.json +3 -3
- data/tracks/ecmascript/exercises/hexadecimal/package.json +3 -3
- data/tracks/ecmascript/exercises/isogram/package.json +3 -3
- data/tracks/ecmascript/exercises/kindergarten-garden/package.json +3 -3
- data/tracks/ecmascript/exercises/largest-series-product/package.json +3 -3
- data/tracks/ecmascript/exercises/leap/package.json +3 -3
- data/tracks/ecmascript/exercises/linked-list/package.json +3 -3
- data/tracks/ecmascript/exercises/luhn/package.json +3 -3
- data/tracks/ecmascript/exercises/matrix/package.json +3 -3
- data/tracks/ecmascript/exercises/meetup/package.json +3 -3
- data/tracks/ecmascript/exercises/nth-prime/package.json +3 -3
- data/tracks/ecmascript/exercises/ocr-numbers/package.json +3 -3
- data/tracks/ecmascript/exercises/octal/package.json +3 -3
- data/tracks/ecmascript/exercises/palindrome-products/package.json +3 -3
- data/tracks/ecmascript/exercises/pangram/package.json +3 -3
- data/tracks/ecmascript/exercises/pascals-triangle/package.json +3 -3
- data/tracks/ecmascript/exercises/perfect-numbers/package.json +3 -3
- data/tracks/ecmascript/exercises/phone-number/package.json +3 -3
- data/tracks/ecmascript/exercises/pig-latin/package.json +3 -3
- data/tracks/ecmascript/exercises/prime-factors/package.json +3 -3
- data/tracks/ecmascript/exercises/pythagorean-triplet/package.json +3 -3
- data/tracks/ecmascript/exercises/queen-attack/package.json +3 -3
- data/tracks/ecmascript/exercises/raindrops/package.json +3 -3
- data/tracks/ecmascript/exercises/rna-transcription/package.json +3 -3
- data/tracks/ecmascript/exercises/robot-name/package.json +3 -3
- data/tracks/ecmascript/exercises/robot-simulator/package.json +3 -3
- data/tracks/ecmascript/exercises/roman-numerals/package.json +3 -3
- data/tracks/ecmascript/exercises/saddle-points/package.json +3 -3
- data/tracks/ecmascript/exercises/say/package.json +3 -3
- data/tracks/ecmascript/exercises/scrabble-score/package.json +3 -3
- data/tracks/ecmascript/exercises/secret-handshake/package.json +3 -3
- data/tracks/ecmascript/exercises/series/package.json +3 -3
- data/tracks/ecmascript/exercises/sieve/package.json +3 -3
- data/tracks/ecmascript/exercises/simple-cipher/package.json +3 -3
- data/tracks/ecmascript/exercises/space-age/package.json +3 -3
- data/tracks/ecmascript/exercises/strain/package.json +3 -3
- data/tracks/ecmascript/exercises/sum-of-multiples/package.json +3 -3
- data/tracks/ecmascript/exercises/triangle/package.json +3 -3
- data/tracks/ecmascript/exercises/trinary/package.json +3 -3
- data/tracks/ecmascript/exercises/two-bucket/package.json +3 -3
- data/tracks/ecmascript/exercises/word-count/package.json +3 -3
- data/tracks/ecmascript/exercises/wordy/package.json +3 -3
- data/tracks/ecmascript/package.json +3 -3
- data/tracks/ecmascript/yarn.lock +2886 -0
- data/tracks/elixir/exercises/isogram/isogram_test.exs +0 -10
- data/tracks/elixir/exercises/strain/strain.exs +1 -2
- data/tracks/erlang/exercises/roman-numerals/test/roman_numerals_tests.erl +1 -1
- data/tracks/go/exercises/binary-search-tree/binary_search_tree_test.go +36 -9
- data/tracks/go/exercises/bracket-push/.meta/gen.go +49 -0
- data/tracks/go/exercises/bracket-push/bracket_push_test.go +1 -43
- data/tracks/go/exercises/bracket-push/cases_test.go +83 -0
- data/tracks/go/exercises/bracket-push/example.go +13 -16
- data/tracks/go/gen/gen.go +26 -2
- data/tracks/haskell/exercises/accumulate/package.yaml +1 -1
- data/tracks/haskell/exercises/accumulate/test/Tests.hs +2 -2
- data/tracks/haskell/exercises/acronym/package.yaml +1 -1
- data/tracks/haskell/exercises/acronym/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/all-your-base/package.yaml +1 -1
- data/tracks/haskell/exercises/all-your-base/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/allergies/package.yaml +1 -1
- data/tracks/haskell/exercises/allergies/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/alphametics/package.yaml +1 -1
- data/tracks/haskell/exercises/alphametics/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/anagram/package.yaml +1 -1
- data/tracks/haskell/exercises/anagram/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/atbash-cipher/package.yaml +1 -1
- data/tracks/haskell/exercises/atbash-cipher/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/bank-account/package.yaml +1 -1
- data/tracks/haskell/exercises/bank-account/test/Tests.hs +2 -2
- data/tracks/haskell/exercises/beer-song/package.yaml +1 -1
- data/tracks/haskell/exercises/beer-song/test/Tests.hs +8 -10
- data/tracks/haskell/exercises/binary-search-tree/package.yaml +1 -1
- data/tracks/haskell/exercises/binary-search-tree/test/Tests.hs +2 -2
- data/tracks/haskell/exercises/binary/package.yaml +1 -1
- data/tracks/haskell/exercises/binary/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/bob/package.yaml +1 -1
- data/tracks/haskell/exercises/bob/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/bowling/package.yaml +1 -1
- data/tracks/haskell/exercises/bowling/test/Tests.hs +5 -6
- data/tracks/haskell/exercises/bracket-push/package.yaml +1 -1
- data/tracks/haskell/exercises/bracket-push/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/change/package.yaml +1 -1
- data/tracks/haskell/exercises/change/test/Tests.hs +2 -3
- data/tracks/haskell/exercises/clock/package.yaml +1 -1
- data/tracks/haskell/exercises/clock/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/connect/package.yaml +1 -1
- data/tracks/haskell/exercises/connect/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/crypto-square/package.yaml +1 -1
- data/tracks/haskell/exercises/crypto-square/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/custom-set/package.yaml +1 -1
- data/tracks/haskell/exercises/custom-set/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/difference-of-squares/package.yaml +1 -1
- data/tracks/haskell/exercises/difference-of-squares/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/dominoes/package.yaml +1 -1
- data/tracks/haskell/exercises/dominoes/test/Tests.hs +2 -3
- data/tracks/haskell/exercises/etl/package.yaml +1 -1
- data/tracks/haskell/exercises/etl/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/food-chain/package.yaml +1 -1
- data/tracks/haskell/exercises/food-chain/test/Tests.hs +8 -10
- data/tracks/haskell/exercises/forth/package.yaml +1 -1
- data/tracks/haskell/exercises/forth/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/gigasecond/package.yaml +1 -1
- data/tracks/haskell/exercises/gigasecond/test/Tests.hs +12 -13
- data/tracks/haskell/exercises/go-counting/package.yaml +1 -1
- data/tracks/haskell/exercises/go-counting/test/Tests.hs +2 -2
- data/tracks/haskell/exercises/grade-school/package.yaml +1 -1
- data/tracks/haskell/exercises/grade-school/test/Tests.hs +2 -2
- data/tracks/haskell/exercises/grains/package.yaml +1 -1
- data/tracks/haskell/exercises/grains/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/hamming/package.yaml +1 -1
- data/tracks/haskell/exercises/hamming/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/hello-world/package.yaml +1 -1
- data/tracks/haskell/exercises/hello-world/test/Tests.hs +3 -5
- data/tracks/haskell/exercises/hexadecimal/package.yaml +1 -1
- data/tracks/haskell/exercises/hexadecimal/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/house/package.yaml +1 -1
- data/tracks/haskell/exercises/house/test/Tests.hs +8 -10
- data/tracks/haskell/exercises/kindergarten-garden/package.yaml +1 -1
- data/tracks/haskell/exercises/kindergarten-garden/test/Tests.hs +2 -2
- data/tracks/haskell/exercises/largest-series-product/package.yaml +1 -1
- data/tracks/haskell/exercises/largest-series-product/test/Tests.hs +1 -3
- data/tracks/haskell/exercises/leap/package.yaml +1 -1
- data/tracks/haskell/exercises/leap/test/Tests.hs +9 -22
- data/tracks/haskell/exercises/lens-person/package.yaml +1 -1
- data/tracks/haskell/exercises/lens-person/test/Tests.hs +2 -2
- data/tracks/haskell/exercises/linked-list/package.yaml +1 -1
- data/tracks/haskell/exercises/linked-list/test/Tests.hs +2 -2
- data/tracks/haskell/exercises/list-ops/package.yaml +1 -1
- data/tracks/haskell/exercises/list-ops/test/Tests.hs +2 -2
- data/tracks/haskell/exercises/luhn/examples/success-standard/src/Luhn.hs +8 -23
- data/tracks/haskell/exercises/luhn/package.yaml +1 -1
- data/tracks/haskell/exercises/luhn/src/Luhn.hs +2 -14
- data/tracks/haskell/exercises/luhn/test/Tests.hs +68 -70
- data/tracks/haskell/exercises/matrix/package.yaml +1 -1
- data/tracks/haskell/exercises/matrix/test/Tests.hs +2 -2
- data/tracks/haskell/exercises/meetup/package.yaml +1 -1
- data/tracks/haskell/exercises/meetup/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/minesweeper/package.yaml +1 -1
- data/tracks/haskell/exercises/minesweeper/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/nth-prime/package.yaml +1 -1
- data/tracks/haskell/exercises/nth-prime/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/nucleotide-count/package.yaml +1 -1
- data/tracks/haskell/exercises/nucleotide-count/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/ocr-numbers/package.yaml +1 -1
- data/tracks/haskell/exercises/ocr-numbers/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/octal/package.yaml +1 -1
- data/tracks/haskell/exercises/octal/test/Tests.hs +2 -2
- data/tracks/haskell/exercises/palindrome-products/package.yaml +1 -1
- data/tracks/haskell/exercises/palindrome-products/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/pangram/package.yaml +1 -1
- data/tracks/haskell/exercises/pangram/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/parallel-letter-frequency/package.yaml +1 -1
- data/tracks/haskell/exercises/parallel-letter-frequency/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/pascals-triangle/package.yaml +1 -1
- data/tracks/haskell/exercises/pascals-triangle/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/phone-number/examples/success-standard/src/Phone.hs +12 -3
- data/tracks/haskell/exercises/phone-number/package.yaml +1 -1
- data/tracks/haskell/exercises/phone-number/test/Tests.hs +24 -17
- data/tracks/haskell/exercises/pig-latin/package.yaml +1 -1
- data/tracks/haskell/exercises/pig-latin/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/pov/package.yaml +1 -1
- data/tracks/haskell/exercises/pov/test/Tests.hs +6 -9
- data/tracks/haskell/exercises/prime-factors/package.yaml +1 -1
- data/tracks/haskell/exercises/prime-factors/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/pythagorean-triplet/package.yaml +1 -1
- data/tracks/haskell/exercises/pythagorean-triplet/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/queen-attack/package.yaml +1 -1
- data/tracks/haskell/exercises/queen-attack/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/raindrops/package.yaml +1 -1
- data/tracks/haskell/exercises/raindrops/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/rna-transcription/package.yaml +1 -1
- data/tracks/haskell/exercises/rna-transcription/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/robot-name/package.yaml +1 -1
- data/tracks/haskell/exercises/robot-name/test/Tests.hs +2 -2
- data/tracks/haskell/exercises/robot-simulator/package.yaml +1 -1
- data/tracks/haskell/exercises/robot-simulator/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/roman-numerals/package.yaml +1 -1
- data/tracks/haskell/exercises/roman-numerals/test/Tests.hs +59 -41
- data/tracks/haskell/exercises/run-length-encoding/package.yaml +1 -1
- data/tracks/haskell/exercises/run-length-encoding/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/saddle-points/package.yaml +1 -1
- data/tracks/haskell/exercises/saddle-points/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/say/package.yaml +1 -1
- data/tracks/haskell/exercises/say/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/scrabble-score/package.yaml +1 -1
- data/tracks/haskell/exercises/scrabble-score/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/secret-handshake/package.yaml +1 -1
- data/tracks/haskell/exercises/secret-handshake/test/Tests.hs +2 -2
- data/tracks/haskell/exercises/series/package.yaml +1 -1
- data/tracks/haskell/exercises/series/test/Tests.hs +2 -2
- data/tracks/haskell/exercises/sgf-parsing/package.yaml +1 -1
- data/tracks/haskell/exercises/sgf-parsing/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/sieve/package.yaml +1 -1
- data/tracks/haskell/exercises/sieve/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/simple-cipher/package.yaml +1 -1
- data/tracks/haskell/exercises/simple-cipher/test/Tests.hs +2 -2
- data/tracks/haskell/exercises/simple-linked-list/package.yaml +1 -1
- data/tracks/haskell/exercises/simple-linked-list/test/Tests.hs +2 -2
- data/tracks/haskell/exercises/space-age/package.yaml +1 -1
- data/tracks/haskell/exercises/space-age/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/strain/package.yaml +1 -1
- data/tracks/haskell/exercises/strain/test/Tests.hs +2 -2
- data/tracks/haskell/exercises/sublist/package.yaml +1 -1
- data/tracks/haskell/exercises/sublist/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/sum-of-multiples/package.yaml +1 -1
- data/tracks/haskell/exercises/sum-of-multiples/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/triangle/package.yaml +1 -1
- data/tracks/haskell/exercises/triangle/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/trinary/package.yaml +1 -1
- data/tracks/haskell/exercises/trinary/test/Tests.hs +2 -2
- data/tracks/haskell/exercises/word-count/package.yaml +1 -1
- data/tracks/haskell/exercises/word-count/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/wordy/package.yaml +1 -1
- data/tracks/haskell/exercises/wordy/test/Tests.hs +1 -2
- data/tracks/haskell/exercises/zebra-puzzle/package.yaml +1 -1
- data/tracks/haskell/exercises/zebra-puzzle/test/Tests.hs +3 -4
- data/tracks/haskell/exercises/zipper/package.yaml +1 -1
- data/tracks/haskell/exercises/zipper/test/Tests.hs +2 -2
- data/tracks/java/.github/PULL_REQUEST_TEMPLATE.md +10 -0
- data/tracks/java/POLICIES.md +67 -0
- data/tracks/java/config.json +7 -10
- data/tracks/java/exercises/acronym/src/example/java/Acronym.java +6 -4
- data/tracks/java/exercises/acronym/src/main/java/Acronym.java +11 -0
- data/tracks/java/exercises/atbash-cipher/src/test/java/AtbashTest.java +1 -1
- data/tracks/java/exercises/beer-song/src/test/java/BeerSongTest.java +6 -6
- data/tracks/java/exercises/binary-search-tree/src/test/java/BSTTest.java +8 -8
- data/tracks/java/exercises/binary-search/src/test/java/BinarySearchTest.java +9 -9
- data/tracks/java/exercises/bob/src/test/java/BobTest.java +17 -17
- data/tracks/java/exercises/crypto-square/src/test/java/CryptoSquareTest.java +14 -14
- data/tracks/java/exercises/difference-of-squares/src/example/java/DifferenceOfSquaresCalculator.java +4 -4
- data/tracks/java/exercises/difference-of-squares/src/main/java/DifferenceOfSquaresCalculator.java +11 -1
- data/tracks/java/exercises/hello-world/src/main/java/HelloWorld.java +1 -1
- data/tracks/java/exercises/pangram/src/main/java/PangramChecker.java +2 -1
- data/tracks/java/exercises/raindrops/src/example/java/RaindropConverter.java +4 -3
- data/tracks/java/exercises/raindrops/src/main/java/RaindropConverter.java +7 -0
- data/tracks/java/exercises/rna-transcription/src/example/java/RnaTranscription.java +2 -2
- data/tracks/java/exercises/rna-transcription/src/main/java/RnaTranscription.java +2 -2
- data/tracks/java/exercises/rna-transcription/src/test/java/RnaTranscriptionTest.java +6 -6
- data/tracks/java/exercises/run-length-encoding/build.gradle +17 -0
- data/tracks/java/exercises/run-length-encoding/src/example/java/RunLengthEncoding.java +67 -0
- data/tracks/java/exercises/run-length-encoding/src/main/java/RunLengthEncoding.java +9 -0
- data/tracks/java/exercises/run-length-encoding/src/test/java/RunLengthEncodingTest.java +111 -0
- data/tracks/java/exercises/scrabble-score/src/example/java/Scrabble.java +5 -6
- data/tracks/java/exercises/scrabble-score/src/main/java/Scrabble.java +11 -0
- data/tracks/java/exercises/scrabble-score/src/test/java/ScrabbleScoreTest.java +1 -3
- data/tracks/java/exercises/space-age/src/example/java/SpaceAge.java +13 -12
- data/tracks/java/exercises/space-age/src/main/java/SpaceAge.java +43 -0
- data/tracks/javascript/config.json +12 -2
- data/tracks/javascript/docs/TESTS.md +2 -2
- data/tracks/javascript/exercises/minesweeper/example.js +48 -0
- data/tracks/javascript/exercises/minesweeper/minesweeper.spec.js +182 -0
- data/tracks/lisp/.travis.yml +1 -1
- data/tracks/lisp/bin/xlisp-test.lisp +23 -5
- data/tracks/lisp/config.json +114 -29
- data/tracks/ocaml/config.json +10 -5
- data/tracks/ocaml/exercises/acronym/.merlin +5 -0
- data/tracks/ocaml/exercises/acronym/Makefile +11 -0
- data/tracks/ocaml/exercises/acronym/acronym.mli +2 -0
- data/tracks/ocaml/exercises/acronym/example.ml +12 -0
- data/tracks/ocaml/exercises/acronym/test.ml +26 -0
- data/tracks/ocaml/exercises/bowling/bowling.mli +4 -2
- data/tracks/ocaml/exercises/bowling/example.ml +56 -16
- data/tracks/ocaml/exercises/bowling/test.ml +132 -27
- data/tracks/ocaml/exercises/dominoes/test.ml +1 -1
- data/tracks/ocaml/exercises/phone-number/test.ml +0 -2
- data/tracks/ocaml/tools/test-generator/src/special_cases.ml +16 -0
- data/tracks/ocaml/tools/test-generator/templates/acronym/template.ml +16 -0
- data/tracks/ocaml/tools/test-generator/templates/bowling/template.ml +34 -0
- data/tracks/perl5/.github/stale.yml +21 -0
- data/tracks/perl6/.github/stale.yml +21 -0
- data/tracks/perl6/exercises/accumulate/accumulate.t +5 -13
- data/tracks/perl6/exercises/accumulate/example.yaml +23 -0
- data/tracks/perl6/exercises/allergies/allergies.t +138 -141
- data/tracks/perl6/exercises/allergies/example.yaml +21 -0
- data/tracks/perl6/exercises/anagram/anagram.t +141 -143
- data/tracks/perl6/exercises/anagram/example.yaml +6 -0
- data/tracks/perl6/exercises/atbash-cipher/atbash-cipher.t +99 -101
- data/tracks/perl6/exercises/atbash-cipher/example.yaml +13 -0
- data/tracks/perl6/exercises/grains/example.yaml +13 -0
- data/tracks/perl6/exercises/grains/grains.t +86 -89
- data/tracks/perl6/exercises/linked-list/example.yaml +81 -0
- data/tracks/perl6/exercises/linked-list/linked-list.t +4 -3
- data/tracks/perl6/exercises/raindrops/example.yaml +12 -0
- data/tracks/perl6/exercises/raindrops/raindrops.t +124 -127
- data/tracks/perl6/exercises/rna-transcription/example.yaml +12 -0
- data/tracks/perl6/exercises/rna-transcription/rna-transcription.t +75 -78
- data/tracks/perl6/exercises/robot-name/example.yaml +25 -0
- data/tracks/perl6/exercises/robot-name/robot-name.t +5 -7
- data/tracks/perl6/exercises/scrabble-score/example.yaml +6 -0
- data/tracks/perl6/exercises/scrabble-score/scrabble-score.t +81 -84
- data/tracks/perl6/exercises/space-age/example.yaml +6 -0
- data/tracks/perl6/exercises/space-age/space-age.t +71 -74
- data/tracks/perl6/exercises/word-count/example.yaml +6 -0
- data/tracks/perl6/exercises/word-count/word-count.t +125 -128
- data/tracks/perl6/exercises/wordy/example.yaml +12 -0
- data/tracks/perl6/exercises/wordy/wordy.t +117 -120
- data/tracks/perl6/templates/test.mustache +3 -1
- data/tracks/php/config.json +5 -0
- data/tracks/php/exercises/sum-of-multiples/example.php +15 -0
- data/tracks/php/exercises/sum-of-multiples/sum-of-multiples_test.php +64 -0
- data/tracks/python/exercises/book-store/book_store_test.py +1 -1
- data/tracks/python/exercises/rail-fence-cipher/rail_fence_cipher_test.py +7 -7
- data/tracks/python/exercises/tournament/tournament_test.py +62 -15
- data/tracks/r/docs/TESTS.md +2 -0
- data/tracks/r/exercises/TRACK_HINTS.md +1 -1
- data/tracks/racket/docs/INSTALLATION.md +13 -3
- data/tracks/ruby/README.md +27 -21
- data/tracks/ruby/bin/generate +3 -3
- data/tracks/ruby/config.json +7 -6
- data/tracks/ruby/exercises/accumulate/{example.rb → .meta/solutions/accumulate.rb} +0 -0
- data/tracks/ruby/exercises/acronym/.meta/generator/{acronym_cases.rb → acronym_case.rb} +0 -0
- data/tracks/ruby/exercises/acronym/{example.rb → .meta/solutions/acronym.rb} +0 -0
- data/tracks/ruby/exercises/all-your-base/.meta/generator/{all_your_base_cases.rb → all_your_base_case.rb} +0 -0
- data/tracks/ruby/exercises/all-your-base/{example.rb → .meta/solutions/all_your_base.rb} +0 -0
- data/tracks/ruby/exercises/allergies/{example.rb → .meta/solutions/allergies.rb} +0 -0
- data/tracks/ruby/exercises/alphametics/.meta/generator/{alphametics_cases.rb → alphametics_case.rb} +0 -0
- data/tracks/ruby/exercises/alphametics/.meta/generator/test_template.erb +2 -2
- data/tracks/ruby/exercises/alphametics/{example.rb → .meta/solutions/alphametics.rb} +0 -0
- data/tracks/ruby/exercises/anagram/.meta/generator/{anagram_cases.rb → anagram_case.rb} +0 -0
- data/tracks/ruby/exercises/anagram/{example.rb → .meta/solutions/anagram.rb} +0 -0
- data/tracks/ruby/exercises/atbash-cipher/{example.rb → .meta/solutions/atbash_cipher.rb} +0 -0
- data/tracks/ruby/exercises/beer-song/.meta/generator/{beer_song_cases.rb → beer_song_case.rb} +0 -0
- data/tracks/ruby/exercises/beer-song/{example.rb → .meta/solutions/beer_song.rb} +0 -0
- data/tracks/ruby/exercises/binary-search-tree/{example.rb → .meta/solutions/binary_search_tree.rb} +0 -0
- data/tracks/ruby/exercises/binary-search/{example.rb → .meta/solutions/binary_search.rb} +0 -0
- data/tracks/ruby/exercises/binary/.meta/generator/{binary_cases.rb → binary_case.rb} +0 -0
- data/tracks/ruby/exercises/binary/{example.rb → .meta/solutions/binary.rb} +0 -0
- data/tracks/ruby/exercises/bob/{example.rb → .meta/solutions/bob.rb} +0 -0
- data/tracks/ruby/exercises/bowling/.meta/generator/{bowling_cases.rb → bowling_case.rb} +0 -0
- data/tracks/ruby/exercises/bowling/.meta/generator/test_template.erb +2 -2
- data/tracks/ruby/exercises/bowling/{example.rb → .meta/solutions/bowling.rb} +0 -0
- data/tracks/ruby/exercises/bracket-push/.meta/generator/{bracket_push_cases.rb → bracket_push_case.rb} +0 -0
- data/tracks/ruby/exercises/bracket-push/{example.rb → .meta/solutions/bracket_push.rb} +0 -0
- data/tracks/ruby/exercises/circular-buffer/{example.rb → .meta/solutions/circular_buffer.rb} +0 -0
- data/tracks/ruby/exercises/clock/.meta/generator/{clock_cases.rb → clock_case.rb} +0 -0
- data/tracks/ruby/exercises/clock/{example.rb → .meta/solutions/clock.rb} +0 -0
- data/tracks/ruby/exercises/connect/.meta/generator/{connect_cases.rb → connect_case.rb} +0 -0
- data/tracks/ruby/exercises/connect/.meta/generator/test_template.erb +2 -2
- data/tracks/ruby/exercises/connect/{example.rb → .meta/solutions/connect.rb} +0 -0
- data/tracks/ruby/exercises/crypto-square/{example.rb → .meta/solutions/crypto_square.rb} +0 -0
- data/tracks/ruby/exercises/custom-set/.meta/generator/{custom_set_cases.rb → custom_set_case.rb} +0 -0
- data/tracks/ruby/exercises/custom-set/{example.rb → .meta/solutions/custom_set.rb} +0 -0
- data/tracks/ruby/exercises/diamond/{example.rb → .meta/solutions/diamond.rb} +0 -0
- data/tracks/ruby/exercises/difference-of-squares/.meta/generator/{difference_of_squares_cases.rb → difference_of_squares_case.rb} +0 -0
- data/tracks/ruby/exercises/difference-of-squares/{example.rb → .meta/solutions/difference_of_squares.rb} +0 -0
- data/tracks/ruby/exercises/dominoes/.meta/generator/{dominoes_cases.rb → dominoes_case.rb} +0 -0
- data/tracks/ruby/exercises/dominoes/.meta/generator/test_template.erb +2 -2
- data/tracks/ruby/exercises/dominoes/{example.rb → .meta/solutions/dominoes.rb} +0 -0
- data/tracks/ruby/exercises/dominoes/dominoes_test.rb +2 -2
- data/tracks/ruby/exercises/etl/.meta/generator/{etl_cases.rb → etl_case.rb} +0 -0
- data/tracks/ruby/exercises/etl/{example.rb → .meta/solutions/etl.rb} +0 -0
- data/tracks/ruby/exercises/flatten-array/{example.rb → .meta/solutions/flatten_array.rb} +0 -0
- data/tracks/ruby/exercises/food-chain/{example.rb → .meta/solutions/food_chain.rb} +0 -0
- data/tracks/ruby/exercises/gigasecond/.meta/generator/{gigasecond_cases.rb → gigasecond_case.rb} +0 -0
- data/tracks/ruby/exercises/gigasecond/{example.rb → .meta/solutions/gigasecond.rb} +0 -0
- data/tracks/ruby/exercises/grade-school/{example.rb → .meta/solutions/grade_school.rb} +0 -0
- data/tracks/ruby/exercises/grains/.meta/generator/{grains_cases.rb → grains_case.rb} +0 -0
- data/tracks/ruby/exercises/grains/{example.rb → .meta/solutions/grains.rb} +0 -0
- data/tracks/ruby/exercises/hamming/.meta/generator/{hamming_cases.rb → hamming_case.rb} +0 -0
- data/tracks/ruby/exercises/hamming/{example.rb → .meta/solutions/hamming.rb} +0 -0
- data/tracks/ruby/exercises/hello-world/.meta/generator/{hello_world_cases.rb → hello_world_case.rb} +0 -0
- data/tracks/ruby/exercises/hello-world/.meta/generator/test_template.erb +2 -2
- data/tracks/ruby/exercises/hello-world/{example.rb → .meta/solutions/hello_world.rb} +0 -0
- data/tracks/ruby/exercises/hexadecimal/{example.rb → .meta/solutions/hexadecimal.rb} +0 -0
- data/tracks/ruby/exercises/house/{example.rb → .meta/solutions/house.rb} +0 -0
- data/tracks/ruby/exercises/isogram/.meta/generator/{isogram_cases.rb → isogram_case.rb} +0 -0
- data/tracks/ruby/exercises/isogram/{example.rb → .meta/solutions/isogram.rb} +0 -0
- data/tracks/ruby/exercises/kindergarten-garden/{example.rb → .meta/solutions/kindergarten_garden.rb} +0 -0
- data/tracks/ruby/exercises/largest-series-product/.meta/generator/{largest_series_product_cases.rb → largest_series_product_case.rb} +0 -0
- data/tracks/ruby/exercises/largest-series-product/{example.rb → .meta/solutions/largest_series_product.rb} +0 -0
- data/tracks/ruby/exercises/leap/.meta/generator/{leap_cases.rb → leap_case.rb} +0 -0
- data/tracks/ruby/exercises/leap/.meta/generator/test_template.erb +2 -2
- data/tracks/ruby/exercises/leap/{example.rb → .meta/solutions/leap.rb} +0 -0
- data/tracks/ruby/exercises/linked-list/{example.rb → .meta/solutions/linked_list.rb} +0 -0
- data/tracks/ruby/exercises/list-ops/{example.rb → .meta/solutions/list_ops.rb} +0 -0
- data/tracks/ruby/exercises/luhn/.meta/generator/{luhn_cases.rb → luhn_case.rb} +0 -0
- data/tracks/ruby/exercises/luhn/{example.rb → .meta/solutions/luhn.rb} +0 -0
- data/tracks/ruby/exercises/matrix/{example.rb → .meta/solutions/matrix.rb} +0 -0
- data/tracks/ruby/exercises/meetup/{example.rb → .meta/solutions/meetup.rb} +0 -0
- data/tracks/ruby/exercises/minesweeper/{example.rb → .meta/solutions/minesweeper.rb} +0 -0
- data/tracks/ruby/exercises/nth-prime/.meta/generator/{nth_prime_cases.rb → nth_prime_case.rb} +0 -0
- data/tracks/ruby/exercises/nth-prime/{example.rb → .meta/solutions/nth_prime.rb} +0 -0
- data/tracks/ruby/exercises/nucleotide-count/{example.rb → .meta/solutions/nucleotide_count.rb} +0 -0
- data/tracks/ruby/exercises/ocr-numbers/.meta/generator/{ocr_numbers_cases.rb → ocr_numbers_case.rb} +0 -0
- data/tracks/ruby/exercises/ocr-numbers/{example.rb → .meta/solutions/ocr_numbers.rb} +0 -0
- data/tracks/ruby/exercises/octal/{example.rb → .meta/solutions/octal.rb} +0 -0
- data/tracks/ruby/exercises/palindrome-products/{example.rb → .meta/solutions/palindrome_products.rb} +0 -0
- data/tracks/ruby/exercises/pangram/.meta/generator/{pangram_cases.rb → pangram_case.rb} +0 -0
- data/tracks/ruby/exercises/pangram/{example.rb → .meta/solutions/pangram.rb} +0 -0
- data/tracks/ruby/exercises/pascals-triangle/{example.rb → .meta/solutions/pascals_triangle.rb} +0 -0
- data/tracks/ruby/exercises/perfect-numbers/{example.rb → .meta/solutions/perfect_numbers.rb} +0 -0
- data/tracks/ruby/exercises/phone-number/.meta/generator/{phone_number_cases.rb → phone_number_case.rb} +0 -0
- data/tracks/ruby/exercises/phone-number/{example.rb → .meta/solutions/phone_number.rb} +0 -0
- data/tracks/ruby/exercises/pig-latin/.meta/generator/{pig_latin_cases.rb → pig_latin_case.rb} +0 -0
- data/tracks/ruby/exercises/pig-latin/{example.rb → .meta/solutions/pig_latin.rb} +0 -0
- data/tracks/ruby/exercises/point-mutations/{example.rb → .meta/solutions/point_mutations.rb} +0 -0
- data/tracks/ruby/exercises/poker/{example.rb → .meta/solutions/poker.rb} +0 -0
- data/tracks/ruby/exercises/prime-factors/{example.rb → .meta/solutions/prime_factors.rb} +0 -0
- data/tracks/ruby/exercises/protein-translation/{example.rb → .meta/solutions/protein_translation.rb} +0 -0
- data/tracks/ruby/exercises/proverb/{example.rb → .meta/solutions/proverb.rb} +0 -0
- data/tracks/ruby/exercises/pythagorean-triplet/{example.rb → .meta/solutions/pythagorean_triplet.rb} +0 -0
- data/tracks/ruby/exercises/queen-attack/.meta/generator/{queen_attack_cases.rb → queen_attack_case.rb} +0 -0
- data/tracks/ruby/exercises/queen-attack/{example.rb → .meta/solutions/queen_attack.rb} +0 -0
- data/tracks/ruby/exercises/rail-fence-cipher/{example.rb → .meta/solutions/rail_fence_cipher.rb} +0 -0
- data/tracks/ruby/exercises/raindrops/.meta/generator/{raindrops_cases.rb → raindrops_case.rb} +0 -0
- data/tracks/ruby/exercises/raindrops/{example.rb → .meta/solutions/raindrops.rb} +0 -0
- data/tracks/ruby/exercises/rna-transcription/.meta/generator/{rna_transcription_cases.rb → rna_transcription_case.rb} +0 -0
- data/tracks/ruby/exercises/rna-transcription/{example.rb → .meta/solutions/rna_transcription.rb} +0 -0
- data/tracks/ruby/exercises/robot-name/.meta/solutions/robot_name.rb +21 -0
- data/tracks/ruby/exercises/robot-name/HINTS.md +7 -0
- data/tracks/ruby/exercises/robot-name/robot_name_test.rb +63 -27
- data/tracks/ruby/exercises/robot-simulator/{example.rb → .meta/solutions/robot_simulator.rb} +0 -0
- data/tracks/ruby/exercises/roman-numerals/.meta/generator/{roman_numerals_cases.rb → roman_numerals_case.rb} +0 -0
- data/tracks/ruby/exercises/roman-numerals/{example.rb → .meta/solutions/roman_numerals.rb} +0 -0
- data/tracks/ruby/exercises/run-length-encoding/.meta/generator/{run_length_encoding_cases.rb → run_length_encoding_case.rb} +0 -0
- data/tracks/ruby/exercises/run-length-encoding/{example.rb → .meta/solutions/run_length_encoding.rb} +0 -0
- data/tracks/ruby/exercises/saddle-points/{example.rb → .meta/solutions/saddle_points.rb} +0 -0
- data/tracks/ruby/exercises/say/.meta/generator/{say_cases.rb → say_case.rb} +0 -0
- data/tracks/ruby/exercises/say/{example.rb → .meta/solutions/say.rb} +0 -0
- data/tracks/ruby/exercises/scale-generator/{example.rb → .meta/solutions/scale_generator.rb} +0 -0
- data/tracks/ruby/exercises/scrabble-score/{example.rb → .meta/solutions/scrabble_score.rb} +0 -0
- data/tracks/ruby/exercises/secret-handshake/{example.rb → .meta/solutions/secret_handshake.rb} +0 -0
- data/tracks/ruby/exercises/series/{example.rb → .meta/solutions/series.rb} +0 -0
- data/tracks/ruby/exercises/sieve/.meta/generator/{sieve_cases.rb → sieve_case.rb} +0 -0
- data/tracks/ruby/exercises/sieve/{example.rb → .meta/solutions/sieve.rb} +0 -0
- data/tracks/ruby/exercises/simple-cipher/{example.rb → .meta/solutions/simple_cipher.rb} +0 -0
- data/tracks/ruby/exercises/simple-linked-list/{example.rb → .meta/solutions/simple_linked_list.rb} +0 -0
- data/tracks/ruby/exercises/space-age/{example.rb → .meta/solutions/space_age.rb} +0 -0
- data/tracks/ruby/exercises/strain/{example.rb → .meta/solutions/strain.rb} +0 -0
- data/tracks/ruby/exercises/sum-of-multiples/{example.rb → .meta/solutions/sum_of_multiples.rb} +0 -0
- data/tracks/ruby/exercises/tournament/.meta/generator/{tournament_cases.rb → tournament_case.rb} +0 -0
- data/tracks/ruby/exercises/tournament/{example.rb → .meta/solutions/tournament.rb} +0 -0
- data/tracks/ruby/exercises/transpose/.meta/generator/{transpose_cases.rb → transpose_case.rb} +0 -0
- data/tracks/ruby/exercises/transpose/{example.rb → .meta/solutions/transpose.rb} +0 -0
- data/tracks/ruby/exercises/triangle/.meta/generator/{triangle_cases.rb → triangle_case.rb} +0 -0
- data/tracks/ruby/exercises/triangle/{example.rb → .meta/solutions/triangle.rb} +0 -0
- data/tracks/ruby/exercises/trinary/{example.rb → .meta/solutions/trinary.rb} +0 -0
- data/tracks/ruby/exercises/twelve-days/{example.rb → .meta/solutions/twelve_days.rb} +0 -0
- data/tracks/ruby/exercises/two-bucket/.meta/generator/{two_bucket_cases.rb → two_bucket_case.rb} +0 -0
- data/tracks/ruby/exercises/two-bucket/{example.rb → .meta/solutions/two_bucket.rb} +0 -0
- data/tracks/ruby/exercises/word-count/.meta/generator/{word_count_cases.rb → word_count_case.rb} +0 -0
- data/tracks/ruby/exercises/word-count/{example.rb → .meta/solutions/word_count.rb} +0 -0
- data/tracks/ruby/exercises/wordy/.meta/generator/{wordy_cases.rb → wordy_case.rb} +0 -0
- data/tracks/ruby/exercises/wordy/{example.rb → .meta/solutions/wordy.rb} +0 -0
- data/tracks/ruby/lib/generator.rb +2 -2
- data/tracks/ruby/lib/generator/case_values.rb +2 -5
- data/tracks/ruby/lib/generator/command_line.rb +20 -86
- data/tracks/ruby/lib/generator/command_line/generator_optparser.rb +90 -0
- data/tracks/ruby/lib/generator/exercise_case.rb +2 -2
- data/tracks/ruby/lib/generator/files.rb +0 -12
- data/tracks/ruby/lib/generator/files/generator_cases.rb +28 -17
- data/tracks/ruby/lib/generator/files/metadata_files.rb +1 -3
- data/tracks/ruby/lib/generator/files/track_files.rb +22 -24
- data/tracks/ruby/lib/generator/{repository.rb → implementation.rb} +17 -13
- data/tracks/ruby/lib/generator/template_values.rb +9 -5
- data/tracks/ruby/lib/generator/test_template.erb +2 -2
- data/tracks/ruby/lib/tasks/exercise.rb +12 -20
- data/tracks/ruby/lib/tasks/exercise_tests_runner.rb +1 -1
- data/tracks/ruby/test/fixtures/xruby/exercises/{beta/example.tt → alpha-beta/.meta/generator/test_template.erb} +4 -6
- data/tracks/ruby/test/fixtures/xruby/exercises/alpha/.meta/generator/alpha_case.rb +9 -0
- data/tracks/ruby/test/fixtures/xruby/exercises/alpha/.meta/generator/test_template.erb +2 -2
- data/tracks/ruby/test/fixtures/xruby/exercises/alpha/.meta/solutions/alpha.rb +1 -1
- data/tracks/ruby/test/fixtures/xruby/exercises/beta/.meta/generator/{beta_cases.rb → beta_case.rb} +0 -0
- data/tracks/ruby/test/fixtures/xruby/lib/generator/test_template.erb +2 -2
- data/tracks/ruby/test/generator/case_values_test.rb +3 -3
- data/tracks/ruby/test/generator/command_line/generator_optparser_test.rb +122 -0
- data/tracks/ruby/test/generator/command_line_test.rb +13 -3
- data/tracks/ruby/test/generator/exercise_case_test.rb +2 -2
- data/tracks/ruby/test/generator/files/generate_cases_test.rb +18 -26
- data/tracks/ruby/test/generator/files/metadata_files_test.rb +2 -2
- data/tracks/ruby/test/generator/files/track_files_test.rb +8 -14
- data/tracks/ruby/test/generator/files_test.rb +0 -20
- data/tracks/ruby/test/generator/implementation_test.rb +145 -0
- data/tracks/ruby/test/generator/template_values_test.rb +5 -6
- data/tracks/ruby/test/generator_test.rb +10 -10
- data/tracks/ruby/test/tasks/exercise_test.rb +8 -12
- data/tracks/ruby/test/tasks/exercise_tests_runner_test.rb +2 -2
- data/tracks/ruby/test/test_helper.rb +13 -10
- data/tracks/ruby/test/wordy_cases_test.rb +1 -1
- data/tracks/rust/config.json +1 -0
- data/tracks/rust/exercises/bracket-push/Cargo.toml +1 -1
- data/tracks/rust/exercises/bracket-push/tests/bracket-push.rs +6 -0
- data/tracks/rust/exercises/dominoes/Cargo.toml +1 -1
- data/tracks/rust/exercises/dominoes/tests/dominoes.rs +1 -1
- data/tracks/rust/exercises/luhn-from/.meta/description.md +9 -0
- data/tracks/rust/exercises/luhn-from/.meta/metadata.yml +3 -0
- data/tracks/rust/exercises/luhn-trait/.meta/description.md +17 -0
- data/tracks/rust/exercises/luhn-trait/.meta/metadata.yml +3 -0
- data/tracks/rust/exercises/rectangles/Cargo.toml +1 -1
- data/tracks/rust/exercises/rectangles/tests/rectangles.rs +31 -0
- data/tracks/rust/exercises/tournament/Cargo.toml +1 -1
- data/tracks/rust/exercises/tournament/example.rs +6 -6
- data/tracks/rust/exercises/tournament/tests/tournament.rs +116 -30
- metadata +190 -140
- data/tracks/haskell/exercises/pythagorean-triplet/.meta/DONT-TEST-STUB +0 -2
- data/tracks/java/exercises/acronym/src/main/java/.keep +0 -0
- data/tracks/java/exercises/raindrops/src/main/java/.keep +0 -0
- data/tracks/java/exercises/scrabble-score/src/main/java/.keep +0 -0
- data/tracks/java/exercises/space-age/src/main/java/.keep +0 -0
- data/tracks/ruby/exercises/robot-name/example.rb +0 -43
- data/tracks/ruby/test/fixtures/xruby/exercises/alpha/.meta/generator/alpha_cases.rb +0 -20
- data/tracks/ruby/test/fixtures/xruby/exercises/beta/example.rb +0 -5
- data/tracks/ruby/test/generator/repository_test.rb +0 -90
- data/tracks/ruby/test/tasks/exercise_tests_runner_legacy_test.rb +0 -64
data/tracks/ocaml/config.json
CHANGED
@@ -81,6 +81,11 @@
|
|
81
81
|
"difficulty": 3,
|
82
82
|
"topics": ["Strings"]
|
83
83
|
},
|
84
|
+
{
|
85
|
+
"slug": "acronym",
|
86
|
+
"difficulty": 3,
|
87
|
+
"topics": ["Strings"]
|
88
|
+
},
|
84
89
|
{
|
85
90
|
"slug": "all-your-base",
|
86
91
|
"difficulty": 4,
|
@@ -91,11 +96,6 @@
|
|
91
96
|
"difficulty": 4,
|
92
97
|
"topics": ["Stacks"]
|
93
98
|
},
|
94
|
-
{
|
95
|
-
"slug": "bowling",
|
96
|
-
"difficulty": 4,
|
97
|
-
"topics": []
|
98
|
-
},
|
99
99
|
{
|
100
100
|
"slug": "luhn",
|
101
101
|
"difficulty": 4,
|
@@ -161,6 +161,11 @@
|
|
161
161
|
"difficulty": 7,
|
162
162
|
"topics": []
|
163
163
|
},
|
164
|
+
{
|
165
|
+
"slug": "bowling",
|
166
|
+
"difficulty": 7,
|
167
|
+
"topics": []
|
168
|
+
},
|
164
169
|
{
|
165
170
|
"slug": "dominoes",
|
166
171
|
"difficulty": 7,
|
@@ -0,0 +1,12 @@
|
|
1
|
+
open Core.Std
|
2
|
+
|
3
|
+
let (>|>) f g x = f (g x)
|
4
|
+
|
5
|
+
let acronym =
|
6
|
+
let acronymChar = function
|
7
|
+
| "" -> ""
|
8
|
+
| s when String.uppercase s = s -> Char.to_string s.[0]
|
9
|
+
| s -> Char.to_string (Char.uppercase s.[0]) ^ String.filter ~f:Char.is_uppercase (String.drop_prefix s 1) in
|
10
|
+
String.concat ~sep:""
|
11
|
+
>|> List.map ~f:acronymChar
|
12
|
+
>|> String.split_on_chars ~on:[' ';'-']
|
@@ -0,0 +1,26 @@
|
|
1
|
+
open Core.Std
|
2
|
+
open OUnit2
|
3
|
+
open Acronym
|
4
|
+
|
5
|
+
let ae exp got _test_ctxt =
|
6
|
+
assert_equal exp got ~printer:Fn.id
|
7
|
+
|
8
|
+
let tests = [
|
9
|
+
"basic" >::
|
10
|
+
ae "PNG" (acronym "Portable Network Graphics");
|
11
|
+
"lowercase words" >::
|
12
|
+
ae "ROR" (acronym "Ruby on Rails");
|
13
|
+
"camelcase" >::
|
14
|
+
ae "HTML" (acronym "HyperText Markup Language");
|
15
|
+
"punctuation" >::
|
16
|
+
ae "FIFO" (acronym "First In, First Out");
|
17
|
+
"all caps words" >::
|
18
|
+
ae "PHP" (acronym "PHP: Hypertext Preprocessor");
|
19
|
+
"non-acronym all caps word" >::
|
20
|
+
ae "GIMP" (acronym "GNU Image Manipulation Program");
|
21
|
+
"hyphenated" >::
|
22
|
+
ae "CMOS" (acronym "Complementary metal-oxide semiconductor");
|
23
|
+
]
|
24
|
+
|
25
|
+
let () =
|
26
|
+
run_test_tt_main ("acronym tests" >::: tests)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
open Core.Std
|
2
|
+
|
1
3
|
(** Abstract type for the bowling game. *)
|
2
4
|
type t
|
3
5
|
|
@@ -6,7 +8,7 @@ val new_game: t
|
|
6
8
|
|
7
9
|
(** This is called each time the player rolls a ball, with input the number
|
8
10
|
of pins knocked down. The return value is the updated state of the game. *)
|
9
|
-
val roll : int -> t -> t
|
11
|
+
val roll : int -> t -> (t, string) Result.t
|
10
12
|
|
11
13
|
(** This is called at the end of a game to retrieve the final score. *)
|
12
|
-
val score : t -> int
|
14
|
+
val score : t -> (int, string) Result.t
|
@@ -1,19 +1,59 @@
|
|
1
|
-
open Core.Std
|
1
|
+
open! Core.Std
|
2
2
|
|
3
|
-
type t = int list
|
3
|
+
type t = (int * int list)
|
4
4
|
|
5
|
-
|
6
|
-
let
|
7
|
-
|
8
|
-
let rec go acc = function
|
9
|
-
| [t1; t2] -> (t1 + t2) :: acc
|
10
|
-
| [t1; t2; t3] -> (t1 + t2 + t3) :: acc
|
11
|
-
| t1 :: t2 :: t3 :: ts when t1 = 10 -> go (10 + t2 + t3 :: acc) (t2 :: t3 :: ts)
|
12
|
-
| t1 :: t2 :: t3 :: ts when is_spare t1 t2 -> go (10 + t3 :: acc) (t3 :: ts)
|
13
|
-
| t1 :: t2 :: t3 :: ts -> go (t1 + t2 :: acc) (t3 :: ts)
|
14
|
-
| _ -> failwith "this is expected to be unreachable code"
|
15
|
-
in go []
|
5
|
+
let numberOfFrames = 10
|
6
|
+
let maximumFrameScore = 10
|
7
|
+
let minimumFrameScore = 0
|
16
8
|
|
17
|
-
let new_game = []
|
18
|
-
|
19
|
-
let
|
9
|
+
let new_game = (0, [])
|
10
|
+
|
11
|
+
let validatePins pins = match pins with
|
12
|
+
| _ when pins < minimumFrameScore -> Error "Negative roll is invalid"
|
13
|
+
| _ when pins > maximumFrameScore -> Error "Pin count exceeds pins on the lane"
|
14
|
+
| _ -> Ok pins
|
15
|
+
|
16
|
+
let isStrike pins = pins = maximumFrameScore
|
17
|
+
let isSpare pins1 pins2 = pins1 + pins2 = maximumFrameScore
|
18
|
+
|
19
|
+
let rec scoreRolls (totalScore: int) (frame: int) (rolls: int list): (int * ((int, string) Result.t)) =
|
20
|
+
let isLastFrame = frame = numberOfFrames in
|
21
|
+
let gameFinished = frame = numberOfFrames + 1 in
|
22
|
+
let scoreStrike remainder =
|
23
|
+
match remainder with
|
24
|
+
| x::y::zs when isLastFrame ->
|
25
|
+
if x + y > 10 && x <> 10 then (frame, Error "Should have a test for this error!")
|
26
|
+
else scoreRolls (totalScore + 10 + x + y) (frame + 1) zs
|
27
|
+
| x::y::zs -> scoreRolls (totalScore + 10 + x + y) (frame + 1) (x::y::zs)
|
28
|
+
| _ -> (frame, Error "Score cannot be taken until the end of the game") in
|
29
|
+
let scoreSpare x y remainder =
|
30
|
+
match remainder with
|
31
|
+
| z::zs -> scoreRolls (totalScore + x + y + z) (frame + 1) (if isLastFrame then zs else z::zs)
|
32
|
+
| _ -> (frame, Error "Score cannot be taken until the end of the game") in
|
33
|
+
let scoreNormal x y remainder =
|
34
|
+
match validatePins (x + y) with
|
35
|
+
| Ok z -> scoreRolls (totalScore + z) (frame + 1) remainder
|
36
|
+
| Error e -> (frame, Error e) in
|
37
|
+
match rolls with
|
38
|
+
| [] -> (frame, if gameFinished then Ok totalScore else Error "Score cannot be taken until the end of the game")
|
39
|
+
| x::xs when isStrike x -> scoreStrike xs
|
40
|
+
| x::y::ys when isSpare x y -> scoreSpare x y ys
|
41
|
+
| x::y::zs -> scoreNormal x y zs
|
42
|
+
| _ -> (frame, Error "Score cannot be taken until the end of the game")
|
43
|
+
|
44
|
+
let roll pins (frames, rolls) =
|
45
|
+
if frames >= 10
|
46
|
+
then Error "Cannot roll after game is over"
|
47
|
+
else
|
48
|
+
match validatePins pins with
|
49
|
+
| Error e -> Error e
|
50
|
+
| Ok _ ->
|
51
|
+
let rolls = rolls @ [pins] in
|
52
|
+
match scoreRolls 0 0 rolls with
|
53
|
+
| (frames', Error "Score cannot be taken until the end of the game") -> Ok (frames', rolls)
|
54
|
+
| (_, Error e) -> Error e
|
55
|
+
| (frames', Ok _) -> Ok (frames', rolls)
|
56
|
+
|
57
|
+
let score (_, frames) =
|
58
|
+
let (_, score) = scoreRolls 0 1 frames
|
59
|
+
in score
|
@@ -1,36 +1,141 @@
|
|
1
|
-
open Core.Std
|
1
|
+
open! Core.Std
|
2
2
|
open OUnit2
|
3
|
-
|
3
|
+
open Bowling
|
4
4
|
|
5
|
-
|
5
|
+
type game = Bowling.t
|
6
6
|
|
7
|
-
let
|
8
|
-
|
7
|
+
let to_ok (r: (t, string) Result.t): t = match r with
|
8
|
+
| Ok g -> g
|
9
|
+
| Error e -> failwith ("should be OK but got Error " ^ e)
|
9
10
|
|
10
|
-
let
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
let
|
17
|
-
|
18
|
-
let
|
19
|
-
|
20
|
-
|
11
|
+
let set_previous_frames (frames : int list): game =
|
12
|
+
List.fold frames ~init:new_game ~f:(fun g f -> roll f g |> to_ok)
|
13
|
+
|
14
|
+
let score_printer = function
|
15
|
+
| Ok n -> Int.to_string n
|
16
|
+
| Error e -> e
|
17
|
+
let assert_score exp game = assert_equal ~printer:score_printer exp (score game)
|
18
|
+
|
19
|
+
let roll_printer = function
|
20
|
+
| Ok _ -> "Ok <some game>"
|
21
|
+
| Error e -> e
|
22
|
+
let assert_roll (exp: (t, string) Result.t) (frame: int) (game: game) =
|
23
|
+
assert_equal ~printer:roll_printer exp (roll frame game)
|
21
24
|
|
22
25
|
let tests = [
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
26
|
+
"should be able to score a game with all zeros" >:: (fun _ ->
|
27
|
+
let g = set_previous_frames [0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0] in
|
28
|
+
assert_score (Ok 0) g
|
29
|
+
);
|
30
|
+
"should be able to score a game with no strikes or spares" >:: (fun _ ->
|
31
|
+
let g = set_previous_frames [3; 6; 3; 6; 3; 6; 3; 6; 3; 6; 3; 6; 3; 6; 3; 6; 3; 6; 3; 6] in
|
32
|
+
assert_score (Ok 90) g
|
33
|
+
);
|
34
|
+
"a spare followed by zeros is worth ten points" >:: (fun _ ->
|
35
|
+
let g = set_previous_frames [6; 4; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0] in
|
36
|
+
assert_score (Ok 10) g
|
37
|
+
);
|
38
|
+
"points scored in the roll after a spare are counted twice" >:: (fun _ ->
|
39
|
+
let g = set_previous_frames [6; 4; 3; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0] in
|
40
|
+
assert_score (Ok 16) g
|
41
|
+
);
|
42
|
+
"consecutive spares each get a one roll bonus" >:: (fun _ ->
|
43
|
+
let g = set_previous_frames [5; 5; 3; 7; 4; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0] in
|
44
|
+
assert_score (Ok 31) g
|
45
|
+
);
|
46
|
+
"a spare in the last frame gets a one roll bonus that is counted once" >:: (fun _ ->
|
47
|
+
let g = set_previous_frames [0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 7; 3; 7] in
|
48
|
+
assert_score (Ok 17) g
|
49
|
+
);
|
50
|
+
"a strike earns ten points in a frame with a single roll" >:: (fun _ ->
|
51
|
+
let g = set_previous_frames [10; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0] in
|
52
|
+
assert_score (Ok 10) g
|
53
|
+
);
|
54
|
+
"points scored in the two rolls after a strike are counted twice as a bonus" >:: (fun _ ->
|
55
|
+
let g = set_previous_frames [10; 5; 3; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0] in
|
56
|
+
assert_score (Ok 26) g
|
57
|
+
);
|
58
|
+
"consecutive strikes each get the two roll bonus" >:: (fun _ ->
|
59
|
+
let g = set_previous_frames [10; 10; 10; 5; 3; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0] in
|
60
|
+
assert_score (Ok 81) g
|
61
|
+
);
|
62
|
+
"a strike in the last frame gets a two roll bonus that is counted once" >:: (fun _ ->
|
63
|
+
let g = set_previous_frames [0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 10; 7; 1] in
|
64
|
+
assert_score (Ok 18) g
|
65
|
+
);
|
66
|
+
"rolling a spare with the two roll bonus does not get a bonus roll" >:: (fun _ ->
|
67
|
+
let g = set_previous_frames [0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 10; 7; 3] in
|
68
|
+
assert_score (Ok 20) g
|
69
|
+
);
|
70
|
+
"strikes with the two roll bonus do not get bonus rolls" >:: (fun _ ->
|
71
|
+
let g = set_previous_frames [0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 10; 10; 10] in
|
72
|
+
assert_score (Ok 30) g
|
73
|
+
);
|
74
|
+
"a strike with the one roll bonus after a spare in the last frame does not get a bonus" >:: (fun _ ->
|
75
|
+
let g = set_previous_frames [0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 7; 3; 10] in
|
76
|
+
assert_score (Ok 20) g
|
77
|
+
);
|
78
|
+
"all strikes is a perfect game" >:: (fun _ ->
|
79
|
+
let g = set_previous_frames [10; 10; 10; 10; 10; 10; 10; 10; 10; 10; 10; 10] in
|
80
|
+
assert_score (Ok 300) g
|
81
|
+
);
|
82
|
+
"rolls can not score negative points" >:: (fun _ ->
|
83
|
+
let g = set_previous_frames [] in
|
84
|
+
assert_roll (Error "Negative roll is invalid") (-1) g
|
85
|
+
);
|
86
|
+
"a roll can not score more than 10 points" >:: (fun _ ->
|
87
|
+
let g = set_previous_frames [] in
|
88
|
+
assert_roll (Error "Pin count exceeds pins on the lane") 11 g
|
89
|
+
);
|
90
|
+
"two rolls in a frame can not score more than 10 points" >:: (fun _ ->
|
91
|
+
let g = set_previous_frames [5] in
|
92
|
+
assert_roll (Error "Pin count exceeds pins on the lane") 6 g
|
93
|
+
);
|
94
|
+
"bonus roll after a strike in the last frame can not score more than 10 points" >:: (fun _ ->
|
95
|
+
let g = set_previous_frames [0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 10] in
|
96
|
+
assert_roll (Error "Pin count exceeds pins on the lane") 11 g
|
97
|
+
);
|
98
|
+
"two bonus rolls after a strike in the last frame can not score more than 10 points" >:: (fun _ ->
|
99
|
+
let g = set_previous_frames [0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 10; 5] in
|
100
|
+
assert_roll (Error "Pin count exceeds pins on the lane") 6 g
|
101
|
+
);
|
102
|
+
"two bonus rolls after a strike in the last frame can score more than 10 points if one is a strike" >:: (fun _ ->
|
103
|
+
let g = set_previous_frames [0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 10; 10; 6] in
|
104
|
+
assert_score (Ok 26) g
|
105
|
+
);
|
106
|
+
"the second bonus rolls after a strike in the last frame can not be a strike if the first one is not a strike" >:: (fun _ ->
|
107
|
+
let g = set_previous_frames [0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 10; 6] in
|
108
|
+
assert_roll (Error "Pin count exceeds pins on the lane") 10 g
|
109
|
+
);
|
110
|
+
"second bonus roll after a strike in the last frame can not score than 10 points" >:: (fun _ ->
|
111
|
+
let g = set_previous_frames [0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 10; 10] in
|
112
|
+
assert_roll (Error "Pin count exceeds pins on the lane") 11 g
|
113
|
+
);
|
114
|
+
"an unstarted game can not be scored" >:: (fun _ ->
|
115
|
+
let g = set_previous_frames [] in
|
116
|
+
assert_score (Error "Score cannot be taken until the end of the game") g
|
117
|
+
);
|
118
|
+
"an incomplete game can not be scored" >:: (fun _ ->
|
119
|
+
let g = set_previous_frames [0; 0] in
|
120
|
+
assert_score (Error "Score cannot be taken until the end of the game") g
|
121
|
+
);
|
122
|
+
"cannot roll if game already has ten frames" >:: (fun _ ->
|
123
|
+
let g = set_previous_frames [0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0] in
|
124
|
+
assert_roll (Error "Cannot roll after game is over") 0 g
|
125
|
+
);
|
126
|
+
"bonus rolls for a strike in the last frame must be rolled before score can be calculated" >:: (fun _ ->
|
127
|
+
let g = set_previous_frames [0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 10] in
|
128
|
+
assert_score (Error "Score cannot be taken until the end of the game") g
|
129
|
+
);
|
130
|
+
"both bonus rolls for a strike in the last frame must be rolled before score can be calculated" >:: (fun _ ->
|
131
|
+
let g = set_previous_frames [0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 10; 10] in
|
132
|
+
assert_score (Error "Score cannot be taken until the end of the game") g
|
133
|
+
);
|
134
|
+
"bonus roll for a spare in the last frame must be rolled before score can be calculated" >:: (fun _ ->
|
135
|
+
let g = set_previous_frames [0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 7; 3] in
|
136
|
+
assert_score (Error "Score cannot be taken until the end of the game") g
|
137
|
+
);
|
33
138
|
]
|
34
139
|
|
35
140
|
let () =
|
36
|
-
run_test_tt_main ("bowling tests" >::: tests)
|
141
|
+
run_test_tt_main ("bowling tests" >::: tests)
|
@@ -58,7 +58,7 @@ let tests = [
|
|
58
58
|
assert_chain [(1,2); (2,3); (3,1); (2,4); (2,4)] true;
|
59
59
|
"separate loops" >::
|
60
60
|
assert_chain [(1,2); (2,3); (3,1); (1,1); (2,2); (3,3)] true;
|
61
|
-
"
|
61
|
+
"nine elements" >::
|
62
62
|
assert_chain [(1,2); (5,3); (3,1); (1,2); (2,4); (1,6); (2,3); (3,4); (5,6)] true;
|
63
63
|
]
|
64
64
|
|
@@ -30,8 +30,6 @@ let tests = [
|
|
30
30
|
ae None (number "123-abc-7890");
|
31
31
|
"invalid with punctuations" >::
|
32
32
|
ae None (number "123-@:!-7890");
|
33
|
-
"invalid with right number of digits but letters mixed in" >::
|
34
|
-
ae None (number "1a2b3c4d5e6f7g8h9i0j");
|
35
33
|
"invalid if area code does not start with 2-9" >::
|
36
34
|
ae None (number "(123) 456-7890");
|
37
35
|
"invalid if exchange code does not start with 2-9" >::
|
@@ -53,6 +53,12 @@ let edit_change_expected (value: json) = match value with
|
|
53
53
|
| `Int (-1) -> "None"
|
54
54
|
| _ -> failwith "Bad json value in change"
|
55
55
|
|
56
|
+
let edit_bowling_expected (value: json) = match value with
|
57
|
+
| `Int n -> "(Ok " ^ (Int.to_string n) ^ ")"
|
58
|
+
| `Assoc [(k, v)] ->
|
59
|
+
if k = "error" then "(Error " ^ json_to_string v ^ ")" else failwith ("Can only handle error value but got " ^ k)
|
60
|
+
| _ -> failwith "Bad json value in bowling"
|
61
|
+
|
56
62
|
let edit_expected ~(stringify: json -> string) ~(slug: string) ~(value: json) = match slug with
|
57
63
|
| "hamming" -> optional_int ~none:(-1) value
|
58
64
|
| "all-your-base" -> optional_int_list value
|
@@ -60,6 +66,7 @@ let edit_expected ~(stringify: json -> string) ~(slug: string) ~(value: json) =
|
|
60
66
|
| "phone-number" -> option_of_null value
|
61
67
|
| "connect" -> edit_connect_expected value
|
62
68
|
| "change" -> edit_change_expected value
|
69
|
+
| "bowling" -> edit_bowling_expected value
|
63
70
|
| _ -> stringify value
|
64
71
|
|
65
72
|
let edit_say (ps: (string * json) list) =
|
@@ -91,12 +98,21 @@ let edit_space_age (ps: (string * json) list): (string * string) list =
|
|
91
98
|
| (k, v) -> (k, json_to_string v) in
|
92
99
|
List.map ps ~f:edit
|
93
100
|
|
101
|
+
let edit_bowling (ps: (string * json) list): (string * string) list =
|
102
|
+
let strip_quotes s = String.drop_prefix s 1 |> Fn.flip String.drop_suffix 1 in
|
103
|
+
let edit = function
|
104
|
+
| ("property", v) -> ("property", json_to_string v |> strip_quotes)
|
105
|
+
| ("roll", `Int n) -> ("roll", let s = Int.to_string n in if n < 0 then ("(" ^ s ^ ")") else s)
|
106
|
+
| (k, v) -> (k, json_to_string v) in
|
107
|
+
List.map ps ~f:edit
|
108
|
+
|
94
109
|
let edit_parameters ~(slug: string) (parameters: (string * json) list) = match (slug, parameters) with
|
95
110
|
| ("hello-world", ps) -> default_value ~key:"name" ~value:"None" (optional_strings ~f:(fun _x -> true) parameters)
|
96
111
|
| ("say", ps) -> edit_say ps
|
97
112
|
| ("all-your-base", ps) -> edit_all_your_base ps
|
98
113
|
| ("dominoes", ps) -> edit_dominoes ps
|
99
114
|
| ("space-age", ps) -> edit_space_age ps
|
115
|
+
| ("bowling", ps) -> edit_bowling ps
|
100
116
|
| (_, ps) -> map_elements json_to_string ps
|
101
117
|
|
102
118
|
let expected_key_name slug = match slug with
|
@@ -0,0 +1,16 @@
|
|
1
|
+
open Core.Std
|
2
|
+
open OUnit2
|
3
|
+
open Acronym
|
4
|
+
|
5
|
+
let ae exp got _test_ctxt =
|
6
|
+
assert_equal exp got ~printer:Fn.id
|
7
|
+
|
8
|
+
let tests = [
|
9
|
+
(* TEST
|
10
|
+
"$description" >::
|
11
|
+
ae $expected (acronym $phrase);
|
12
|
+
END TEST *)
|
13
|
+
]
|
14
|
+
|
15
|
+
let () =
|
16
|
+
run_test_tt_main ("acronym tests" >::: tests)
|
@@ -0,0 +1,34 @@
|
|
1
|
+
open! Core.Std
|
2
|
+
open OUnit2
|
3
|
+
open Bowling
|
4
|
+
|
5
|
+
type game = Bowling.t
|
6
|
+
|
7
|
+
let to_ok = function
|
8
|
+
| Ok x -> x
|
9
|
+
| Error _ -> failwith "should be OK"
|
10
|
+
|
11
|
+
let set_previous_frames (frames : int list): game =
|
12
|
+
List.fold frames ~init:new_game ~f:(fun g f -> roll f g |> to_ok)
|
13
|
+
|
14
|
+
let score_printer = function
|
15
|
+
| Ok n -> Int.to_string n
|
16
|
+
| Error e -> e
|
17
|
+
let assert_score exp game = assert_equal ~printer:score_printer exp (score game)
|
18
|
+
|
19
|
+
let roll_printer = function
|
20
|
+
| Ok _ -> "Ok <some game>"
|
21
|
+
| Error e -> e
|
22
|
+
let assert_roll exp frame game = assert_equal ~printer:roll_printer exp (roll frame game)
|
23
|
+
|
24
|
+
let tests = [
|
25
|
+
(* TEST
|
26
|
+
"$description" >:: (fun _ ->
|
27
|
+
let g = set_previous_frames $previous_rolls in
|
28
|
+
assert_$property $expected $roll g
|
29
|
+
);
|
30
|
+
END TEST *)
|
31
|
+
]
|
32
|
+
|
33
|
+
let () =
|
34
|
+
run_test_tt_main ("bowling tests" >::: tests)
|