trackler 2.1.0.48 → 2.1.0.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitmodules +88 -82
- data/CONTRIBUTING.md +5 -5
- data/fixtures/{common → problem-specifications}/exercises/apple/canonical-data.json +0 -0
- data/fixtures/{common → problem-specifications}/exercises/apple/description.md +0 -0
- data/fixtures/{common → problem-specifications}/exercises/apple/metadata.yml +0 -0
- data/fixtures/{common → problem-specifications}/exercises/banana/description.md +0 -0
- data/fixtures/{common → problem-specifications}/exercises/banana/metadata.yml +0 -0
- data/fixtures/{common → problem-specifications}/exercises/cherry/description.md +0 -0
- data/fixtures/{common → problem-specifications}/exercises/cherry/metadata.yml +0 -0
- data/fixtures/{common → problem-specifications}/exercises/dog/description.md +0 -0
- data/fixtures/{common → problem-specifications}/exercises/dog/metadata.yml +0 -0
- data/fixtures/{common → problem-specifications}/exercises/fish/.deprecated +0 -0
- data/fixtures/{common → problem-specifications}/exercises/fish/canonical-data.json +0 -0
- data/fixtures/{common → problem-specifications}/exercises/fish/description.md +0 -0
- data/fixtures/{common → problem-specifications}/exercises/fish/metadata.yml +0 -0
- data/fixtures/{common → problem-specifications}/exercises/hello-world/description.md +0 -0
- data/fixtures/{common → problem-specifications}/exercises/hello-world/metadata.yml +0 -0
- data/fixtures/{common → problem-specifications}/exercises/imbe/description.md +0 -0
- data/fixtures/{common → problem-specifications}/exercises/imbe/metadata.yml +0 -0
- data/fixtures/{common → problem-specifications}/exercises/mango/canonical-data.json +0 -0
- data/fixtures/{common → problem-specifications}/exercises/mango/description.md +0 -0
- data/fixtures/{common → problem-specifications}/exercises/mango/metadata.yml +0 -0
- data/fixtures/{common → problem-specifications}/exercises/no-metadata/description.md +0 -0
- data/fixtures/{common → problem-specifications}/exercises/one/description.md +0 -0
- data/fixtures/{common → problem-specifications}/exercises/one/metadata.yml +0 -0
- data/fixtures/{common → problem-specifications}/exercises/three/description.md +0 -0
- data/fixtures/{common → problem-specifications}/exercises/three/metadata.yml +0 -0
- data/fixtures/{common → problem-specifications}/exercises/two/description.md +0 -0
- data/fixtures/{common → problem-specifications}/exercises/two/metadata.yml +0 -0
- data/fixtures/tracks/animal/exercises/fish/included-via-symlink.txt +1 -0
- data/lib/trackler/guaranteed_file.rb +3 -3
- data/lib/trackler/specification.rb +4 -4
- data/lib/trackler/specifications.rb +1 -1
- data/lib/trackler/version.rb +1 -1
- data/{common → problem-specifications}/.gitignore +0 -0
- data/{common → problem-specifications}/.travis.yml +0 -0
- data/{common → problem-specifications}/CONTRIBUTING.md +11 -51
- data/{common → problem-specifications}/LICENSE +0 -0
- data/{common → problem-specifications}/README.md +2 -9
- data/{common → problem-specifications}/TOPICS.txt +0 -0
- data/{common → problem-specifications}/bin/check_required_files_present +0 -0
- data/{common → problem-specifications}/bin/transfer_blurb_to_description.rb +2 -2
- data/{common → problem-specifications}/canonical-schema.json +0 -0
- data/{common → problem-specifications}/exercises/accumulate/description.md +0 -0
- data/{common → problem-specifications}/exercises/accumulate/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/acronym/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/acronym/description.md +0 -0
- data/{common → problem-specifications}/exercises/acronym/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/all-your-base/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/all-your-base/description.md +0 -0
- data/{common → problem-specifications}/exercises/all-your-base/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/allergies/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/allergies/description.md +0 -0
- data/{common → problem-specifications}/exercises/allergies/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/alphametics/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/alphametics/description.md +0 -0
- data/{common → problem-specifications}/exercises/alphametics/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/anagram/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/anagram/description.md +0 -0
- data/{common → problem-specifications}/exercises/anagram/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/atbash-cipher/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/atbash-cipher/description.md +0 -0
- data/{common → problem-specifications}/exercises/atbash-cipher/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/bank-account/description.md +0 -0
- data/{common → problem-specifications}/exercises/bank-account/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/beer-song/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/beer-song/description.md +0 -0
- data/{common → problem-specifications}/exercises/beer-song/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/binary-search-tree/description.md +0 -0
- data/{common → problem-specifications}/exercises/binary-search-tree/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/binary-search/canonical-data.json +2 -2
- data/{common → problem-specifications}/exercises/binary-search/description.md +0 -0
- data/{common → problem-specifications}/exercises/binary-search/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/binary/.deprecated +1 -1
- data/{common → problem-specifications}/exercises/binary/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/binary/description.md +0 -0
- data/{common → problem-specifications}/exercises/binary/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/bob/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/bob/description.md +0 -0
- data/{common → problem-specifications}/exercises/bob/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/book-store/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/book-store/description.md +0 -0
- data/{common → problem-specifications}/exercises/book-store/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/bowling/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/bowling/description.md +0 -0
- data/{common → problem-specifications}/exercises/bowling/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/bracket-push/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/bracket-push/description.md +0 -0
- data/{common → problem-specifications}/exercises/bracket-push/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/change/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/change/description.md +0 -0
- data/{common → problem-specifications}/exercises/change/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/circular-buffer/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/circular-buffer/description.md +0 -0
- data/{common → problem-specifications}/exercises/circular-buffer/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/clock/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/clock/description.md +0 -0
- data/{common → problem-specifications}/exercises/clock/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/collatz-conjecture/canonical-data.json +2 -2
- data/{common → problem-specifications}/exercises/collatz-conjecture/description.md +0 -0
- data/{common → problem-specifications}/exercises/collatz-conjecture/metadata.yml +0 -0
- data/problem-specifications/exercises/complex-numbers/canonical-data.json +270 -0
- data/problem-specifications/exercises/complex-numbers/description.md +3 -0
- data/problem-specifications/exercises/complex-numbers/metadata.yml +4 -0
- data/{common → problem-specifications}/exercises/connect/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/connect/description.md +0 -0
- data/{common → problem-specifications}/exercises/connect/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/counter/.deprecated +1 -1
- data/{common → problem-specifications}/exercises/counter/description.md +1 -1
- data/{common → problem-specifications}/exercises/counter/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/crypto-square/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/crypto-square/description.md +0 -0
- data/{common → problem-specifications}/exercises/crypto-square/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/custom-set/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/custom-set/description.md +0 -0
- data/{common → problem-specifications}/exercises/custom-set/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/diamond/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/diamond/description.md +0 -0
- data/{common → problem-specifications}/exercises/diamond/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/difference-of-squares/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/difference-of-squares/description.md +0 -0
- data/{common → problem-specifications}/exercises/difference-of-squares/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/diffie-hellman/description.md +0 -0
- data/{common → problem-specifications}/exercises/diffie-hellman/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/dominoes/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/dominoes/description.md +0 -0
- data/{common → problem-specifications}/exercises/dominoes/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/dot-dsl/description.md +0 -0
- data/{common → problem-specifications}/exercises/dot-dsl/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/error-handling/description.md +0 -0
- data/{common → problem-specifications}/exercises/error-handling/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/etl/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/etl/description.md +0 -0
- data/{common → problem-specifications}/exercises/etl/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/flatten-array/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/flatten-array/description.md +0 -0
- data/{common → problem-specifications}/exercises/flatten-array/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/food-chain/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/food-chain/description.md +0 -0
- data/{common → problem-specifications}/exercises/food-chain/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/forth/canonical-data.json +10 -1
- data/{common → problem-specifications}/exercises/forth/description.md +0 -0
- data/{common → problem-specifications}/exercises/forth/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/gigasecond/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/gigasecond/description.md +0 -0
- data/{common → problem-specifications}/exercises/gigasecond/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/go-counting/description.md +0 -0
- data/{common → problem-specifications}/exercises/go-counting/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/grade-school/description.md +0 -0
- data/{common → problem-specifications}/exercises/grade-school/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/grains/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/grains/description.md +0 -0
- data/{common → problem-specifications}/exercises/grains/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/grep/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/grep/description.md +0 -0
- data/{common → problem-specifications}/exercises/grep/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/hamming/canonical-data.json +8 -8
- data/{common → problem-specifications}/exercises/hamming/description.md +0 -0
- data/{common → problem-specifications}/exercises/hamming/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/hangman/description.md +0 -0
- data/{common → problem-specifications}/exercises/hangman/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/hello-world/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/hello-world/description.md +0 -0
- data/{common → problem-specifications}/exercises/hello-world/metadata.yml +0 -0
- data/{common/exercises/octal → problem-specifications/exercises/hexadecimal}/.deprecated +1 -1
- data/{common → problem-specifications}/exercises/hexadecimal/description.md +0 -0
- data/{common → problem-specifications}/exercises/hexadecimal/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/house/description.md +0 -0
- data/{common → problem-specifications}/exercises/house/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/isogram/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/isogram/description.md +0 -0
- data/{common → problem-specifications}/exercises/isogram/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/kindergarten-garden/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/kindergarten-garden/description.md +0 -0
- data/{common → problem-specifications}/exercises/kindergarten-garden/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/largest-series-product/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/largest-series-product/description.md +0 -0
- data/{common → problem-specifications}/exercises/largest-series-product/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/leap/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/leap/description.md +0 -0
- data/{common → problem-specifications}/exercises/leap/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/ledger/description.md +0 -0
- data/{common → problem-specifications}/exercises/ledger/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/lens-person/description.md +0 -0
- data/{common → problem-specifications}/exercises/lens-person/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/linked-list/description.md +0 -0
- data/{common → problem-specifications}/exercises/linked-list/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/list-ops/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/list-ops/description.md +0 -0
- data/{common → problem-specifications}/exercises/list-ops/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/luhn/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/luhn/description.md +0 -0
- data/{common → problem-specifications}/exercises/luhn/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/markdown/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/markdown/description.md +0 -0
- data/{common → problem-specifications}/exercises/markdown/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/matrix/description.md +0 -0
- data/{common → problem-specifications}/exercises/matrix/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/meetup/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/meetup/description.md +0 -0
- data/{common → problem-specifications}/exercises/meetup/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/minesweeper/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/minesweeper/description.md +0 -0
- data/{common → problem-specifications}/exercises/minesweeper/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/nth-prime/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/nth-prime/description.md +0 -0
- data/{common → problem-specifications}/exercises/nth-prime/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/nucleotide-codons/.deprecated +1 -1
- data/{common → problem-specifications}/exercises/nucleotide-codons/description.md +0 -0
- data/{common → problem-specifications}/exercises/nucleotide-codons/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/nucleotide-count/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/nucleotide-count/description.md +0 -0
- data/{common → problem-specifications}/exercises/nucleotide-count/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/ocr-numbers/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/ocr-numbers/description.md +0 -0
- data/{common → problem-specifications}/exercises/ocr-numbers/metadata.yml +0 -0
- data/{common/exercises/hexadecimal → problem-specifications/exercises/octal}/.deprecated +1 -1
- data/{common → problem-specifications}/exercises/octal/description.md +0 -0
- data/{common → problem-specifications}/exercises/octal/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/paasio/description.md +0 -0
- data/{common → problem-specifications}/exercises/paasio/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/palindrome-products/description.md +0 -0
- data/{common → problem-specifications}/exercises/palindrome-products/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/pangram/canonical-data.json +2 -2
- data/{common → problem-specifications}/exercises/pangram/description.md +2 -2
- data/{common → problem-specifications}/exercises/pangram/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/parallel-letter-frequency/description.md +0 -0
- data/{common → problem-specifications}/exercises/parallel-letter-frequency/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/pascals-triangle/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/pascals-triangle/description.md +0 -0
- data/{common → problem-specifications}/exercises/pascals-triangle/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/perfect-numbers/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/perfect-numbers/description.md +0 -0
- data/{common → problem-specifications}/exercises/perfect-numbers/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/phone-number/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/phone-number/description.md +12 -10
- data/{common → problem-specifications}/exercises/phone-number/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/pig-latin/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/pig-latin/description.md +0 -0
- data/{common → problem-specifications}/exercises/pig-latin/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/point-mutations/.deprecated +1 -1
- data/{common → problem-specifications}/exercises/point-mutations/description.md +0 -0
- data/{common → problem-specifications}/exercises/point-mutations/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/poker/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/poker/description.md +0 -0
- data/{common → problem-specifications}/exercises/poker/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/pov/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/pov/description.md +0 -0
- data/{common → problem-specifications}/exercises/pov/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/prime-factors/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/prime-factors/description.md +0 -0
- data/{common → problem-specifications}/exercises/prime-factors/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/protein-translation/description.md +0 -0
- data/{common → problem-specifications}/exercises/protein-translation/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/proverb/description.md +0 -0
- data/{common → problem-specifications}/exercises/proverb/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/pythagorean-triplet/description.md +0 -0
- data/{common → problem-specifications}/exercises/pythagorean-triplet/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/queen-attack/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/queen-attack/description.md +0 -0
- data/{common → problem-specifications}/exercises/queen-attack/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/rail-fence-cipher/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/rail-fence-cipher/description.md +0 -0
- data/{common → problem-specifications}/exercises/rail-fence-cipher/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/raindrops/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/raindrops/description.md +0 -0
- data/{common → problem-specifications}/exercises/raindrops/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/react/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/react/description.md +0 -0
- data/{common → problem-specifications}/exercises/react/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/rectangles/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/rectangles/description.md +0 -0
- data/{common → problem-specifications}/exercises/rectangles/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/rna-transcription/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/rna-transcription/description.md +0 -0
- data/{common → problem-specifications}/exercises/rna-transcription/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/robot-name/description.md +0 -0
- data/{common → problem-specifications}/exercises/robot-name/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/robot-simulator/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/robot-simulator/description.md +0 -0
- data/{common → problem-specifications}/exercises/robot-simulator/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/roman-numerals/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/roman-numerals/description.md +0 -0
- data/{common → problem-specifications}/exercises/roman-numerals/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/rotational-cipher/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/rotational-cipher/description.md +0 -0
- data/{common → problem-specifications}/exercises/rotational-cipher/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/run-length-encoding/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/run-length-encoding/description.md +0 -0
- data/{common → problem-specifications}/exercises/run-length-encoding/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/saddle-points/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/saddle-points/description.md +0 -0
- data/{common → problem-specifications}/exercises/saddle-points/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/say/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/say/description.md +0 -0
- data/{common → problem-specifications}/exercises/say/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/scale-generator/description.md +0 -0
- data/{common → problem-specifications}/exercises/scale-generator/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/scrabble-score/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/scrabble-score/description.md +0 -0
- data/{common → problem-specifications}/exercises/scrabble-score/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/secret-handshake/canonical-data.json +2 -2
- data/{common → problem-specifications}/exercises/secret-handshake/description.md +0 -0
- data/{common → problem-specifications}/exercises/secret-handshake/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/series/description.md +0 -0
- data/{common → problem-specifications}/exercises/series/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/sgf-parsing/description.md +0 -0
- data/{common → problem-specifications}/exercises/sgf-parsing/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/sieve/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/sieve/description.md +0 -0
- data/{common → problem-specifications}/exercises/sieve/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/simple-cipher/description.md +0 -0
- data/{common → problem-specifications}/exercises/simple-cipher/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/simple-linked-list/description.md +0 -0
- data/{common → problem-specifications}/exercises/simple-linked-list/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/space-age/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/space-age/description.md +0 -0
- data/{common → problem-specifications}/exercises/space-age/metadata.yml +0 -0
- data/problem-specifications/exercises/spiral-matrix/canonical-data.json +52 -0
- data/problem-specifications/exercises/spiral-matrix/description.md +22 -0
- data/problem-specifications/exercises/spiral-matrix/metadata.yml +4 -0
- data/{common → problem-specifications}/exercises/strain/description.md +0 -0
- data/{common → problem-specifications}/exercises/strain/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/sublist/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/sublist/description.md +0 -0
- data/{common → problem-specifications}/exercises/sublist/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/sum-of-multiples/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/sum-of-multiples/description.md +0 -0
- data/{common → problem-specifications}/exercises/sum-of-multiples/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/tournament/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/tournament/description.md +0 -0
- data/{common → problem-specifications}/exercises/tournament/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/transpose/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/transpose/description.md +0 -0
- data/{common → problem-specifications}/exercises/transpose/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/tree-building/description.md +0 -0
- data/{common → problem-specifications}/exercises/tree-building/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/triangle/canonical-data.json +1 -1
- data/{common → problem-specifications}/exercises/triangle/description.md +0 -0
- data/{common → problem-specifications}/exercises/triangle/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/trinary/.deprecated +1 -1
- data/{common → problem-specifications}/exercises/trinary/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/trinary/description.md +0 -0
- data/{common → problem-specifications}/exercises/trinary/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/twelve-days/description.md +0 -0
- data/{common → problem-specifications}/exercises/twelve-days/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/two-bucket/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/two-bucket/description.md +0 -0
- data/{common → problem-specifications}/exercises/two-bucket/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/two-fer/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/two-fer/description.md +0 -0
- data/{common → problem-specifications}/exercises/two-fer/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/variable-length-quantity/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/variable-length-quantity/description.md +0 -0
- data/{common → problem-specifications}/exercises/variable-length-quantity/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/word-count/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/word-count/description.md +0 -0
- data/{common → problem-specifications}/exercises/word-count/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/word-search/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/word-search/description.md +0 -0
- data/{common → problem-specifications}/exercises/word-search/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/wordy/canonical-data.json +0 -0
- data/{common → problem-specifications}/exercises/wordy/description.md +0 -0
- data/{common → problem-specifications}/exercises/wordy/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/zebra-puzzle/description.md +0 -0
- data/{common → problem-specifications}/exercises/zebra-puzzle/metadata.yml +0 -0
- data/{common → problem-specifications}/exercises/zipper/description.md +0 -0
- data/{common → problem-specifications}/exercises/zipper/metadata.yml +0 -0
- data/{common → problem-specifications}/package.json +2 -2
- data/{common → problem-specifications}/yarn.lock +0 -0
- data/trackler.gemspec +1 -1
- data/tracks/bash/config.json +7 -0
- data/tracks/bash/exercises/pangram/example.sh +7 -0
- data/tracks/bash/exercises/pangram/pangram_tests.sh +47 -0
- data/tracks/c/config.json +19 -0
- data/tracks/c/exercises/acronym/makefile +15 -0
- data/tracks/c/exercises/acronym/src/example.c +44 -0
- data/tracks/c/exercises/acronym/src/example.h +6 -0
- data/tracks/c/exercises/acronym/test/test_acronym.c +68 -0
- data/tracks/c/exercises/acronym/test/vendor/unity.c +1300 -0
- data/tracks/c/exercises/acronym/test/vendor/unity.h +274 -0
- data/tracks/c/exercises/acronym/test/vendor/unity_internals.h +701 -0
- data/tracks/c/exercises/isogram/makefile +15 -0
- data/tracks/c/exercises/isogram/src/example.c +26 -0
- data/tracks/c/exercises/isogram/src/example.h +8 -0
- data/tracks/c/exercises/isogram/test/test_isogram.c +66 -0
- data/tracks/c/exercises/isogram/test/vendor/unity.c +1300 -0
- data/tracks/c/exercises/isogram/test/vendor/unity.h +274 -0
- data/tracks/c/exercises/isogram/test/vendor/unity_internals.h +701 -0
- data/tracks/{dartlang → chapel}/.gitignore +0 -0
- data/tracks/{dartlang → chapel}/.travis.yml +0 -0
- data/tracks/{dartlang → chapel}/LICENSE +0 -0
- data/tracks/chapel/README.md +11 -0
- data/tracks/{dartlang → chapel}/bin/fetch-configlet +0 -0
- data/tracks/{dartlang → chapel}/config.json +3 -3
- data/tracks/{dartlang → chapel}/docs/ABOUT.md +0 -0
- data/tracks/{dartlang → chapel}/docs/EXERCISE_README_INSERT.md +0 -0
- data/tracks/{dartlang → chapel}/docs/INSTALLATION.md +0 -0
- data/tracks/{dartlang → chapel}/docs/LEARNING.md +0 -0
- data/tracks/{dartlang → chapel}/docs/RESOURCES.md +0 -0
- data/tracks/{dartlang → chapel}/docs/TESTS.md +0 -0
- data/tracks/{dartlang/img → chapel/exercises}/.keep +0 -0
- data/tracks/chapel/img/.keep +0 -0
- data/tracks/clojurescript/README.md +1 -1
- data/tracks/clojurescript/config.json +1 -1
- data/tracks/coffeescript/config.json +1 -1
- data/tracks/coldfusion/config.json +1 -1
- data/tracks/coq/README.md +1 -1
- data/tracks/coq/config.json +1 -1
- data/tracks/coq/docs/EXERCISE_README_INSERT.md +1 -1
- data/tracks/cpp/CMakeLists.txt +1 -0
- data/tracks/cpp/config.json +8 -0
- data/tracks/cpp/exercises/allergies/CMakeLists.txt +52 -0
- data/tracks/cpp/exercises/allergies/allergies_test.cpp +148 -0
- data/tracks/cpp/exercises/allergies/example.cpp +30 -0
- data/tracks/cpp/exercises/allergies/example.h +36 -0
- data/tracks/csharp/build.ps1 +2 -2
- data/tracks/csharp/build.sh +2 -2
- data/tracks/csharp/exercises/all-your-base/AllYourBase.cs +1 -1
- data/tracks/csharp/exercises/all-your-base/AllYourBaseTest.cs +103 -102
- data/tracks/csharp/exercises/all-your-base/Example.cs +1 -1
- data/tracks/csharp/exercises/beer-song/BeerSongTest.cs +322 -322
- data/tracks/csharp/exercises/bob/BobTest.cs +2 -0
- data/tracks/csharp/exercises/book-store/BookStore.cs +1 -1
- data/tracks/csharp/exercises/book-store/BookStoreTest.cs +42 -28
- data/tracks/csharp/exercises/book-store/Example.cs +5 -5
- data/tracks/csharp/exercises/food-chain/FoodChainTest.cs +96 -96
- data/tracks/csharp/exercises/nth-prime/NthPrimeTest.cs +1 -2
- data/tracks/csharp/exercises/perfect-numbers/PerfectNumbersTest.cs +2 -3
- data/tracks/csharp/exercises/transpose/Example.cs +14 -14
- data/tracks/csharp/exercises/transpose/TransposeTest.cs +34 -44
- data/tracks/csharp/exercises/wordy/WordyTest.cs +2 -3
- data/tracks/csharp/generators/Exercise.cs +23 -0
- data/tracks/csharp/generators/ExerciseCollection.cs +33 -0
- data/tracks/csharp/generators/Exercises/Acronym.cs +6 -0
- data/tracks/csharp/generators/Exercises/AllYourBase.cs +22 -0
- data/tracks/csharp/generators/Exercises/AtbashCipher.cs +6 -0
- data/tracks/csharp/generators/Exercises/BeerSong.cs +11 -0
- data/tracks/csharp/generators/Exercises/Bob.cs +2 -16
- data/tracks/csharp/generators/Exercises/BookStore.cs +16 -0
- data/tracks/csharp/generators/Exercises/FoodChain.cs +16 -0
- data/tracks/csharp/generators/Exercises/HelloWorld.cs +6 -0
- data/tracks/csharp/generators/Exercises/Isogram.cs +6 -0
- data/tracks/csharp/generators/Exercises/Leap.cs +11 -0
- data/tracks/csharp/generators/Exercises/Luhn.cs +11 -0
- data/tracks/csharp/generators/Exercises/NthPrime.cs +13 -0
- data/tracks/csharp/generators/Exercises/PerfectNumbers.cs +21 -0
- data/tracks/csharp/generators/Exercises/PigLatin.cs +6 -0
- data/tracks/csharp/generators/Exercises/Raindrops.cs +6 -0
- data/tracks/csharp/generators/Exercises/RomanNumerals.cs +15 -0
- data/tracks/csharp/generators/Exercises/RotationalCipher.cs +6 -0
- data/tracks/csharp/generators/Exercises/Transpose.cs +19 -0
- data/tracks/csharp/generators/Exercises/Wordy.cs +13 -0
- data/tracks/csharp/generators/Generators.csproj +8 -2
- data/tracks/csharp/generators/{Data → Input}/CanonicalData.cs +1 -3
- data/tracks/csharp/generators/Input/CanonicalDataCase.cs +37 -0
- data/tracks/csharp/generators/Input/CanonicalDataCaseJsonConverter.cs +43 -0
- data/tracks/csharp/generators/{Data → Input}/CanonicalDataCasesJsonConverter.cs +6 -11
- data/tracks/csharp/generators/{Data → Input}/CanonicalDataParser.cs +1 -1
- data/tracks/csharp/generators/Output/BooleanTestMethodGenerator.cs +13 -0
- data/tracks/csharp/generators/Output/EqualityTestMethodGenerator.cs +10 -0
- data/tracks/csharp/generators/Output/ExceptionTestMethodGenerator.cs +12 -0
- data/tracks/csharp/generators/Output/NameExtensions.cs +35 -0
- data/tracks/csharp/generators/Output/TestClass.cs +12 -0
- data/tracks/csharp/generators/Output/TestClass.liquid +20 -0
- data/tracks/csharp/generators/Output/TestClassFile.cs +22 -0
- data/tracks/csharp/generators/Output/TestClassGenerator.cs +30 -0
- data/tracks/csharp/generators/Output/TestClassRenderer.cs +26 -0
- data/tracks/csharp/generators/Output/TestMethod.cs +10 -0
- data/tracks/csharp/generators/Output/TestMethodGenerator.cs +95 -0
- data/tracks/csharp/generators/Output/UnescapedValue.cs +11 -0
- data/tracks/csharp/generators/Output/ValueFormatter.cs +100 -0
- data/tracks/csharp/generators/Program.cs +10 -42
- data/tracks/csharp/generators/Properties/launchSettings.json +7 -0
- data/tracks/csharp/generators/{Methods/TestedMethodType.cs → TestedMethodType.cs} +1 -1
- data/tracks/{dlang → d}/.gitignore +0 -0
- data/tracks/{dlang → d}/.travis.yml +0 -0
- data/tracks/{dlang → d}/LICENSE +0 -0
- data/tracks/{dlang → d}/README.md +1 -1
- data/tracks/{dlang → d}/bin/fetch-configlet +0 -0
- data/tracks/{dlang → d}/bin/test-all-exercises +0 -0
- data/tracks/{dlang → d}/bin/test-exercise +0 -0
- data/tracks/{dlang → d}/config.json +2 -2
- data/tracks/{dlang → d}/docs/ABOUT.md +0 -0
- data/tracks/{dlang → d}/docs/EXERCISE_README_INSERT.md +0 -0
- data/tracks/{dlang → d}/docs/INSTALLATION.md +0 -0
- data/tracks/{dlang → d}/docs/LEARNING.md +0 -0
- data/tracks/{dlang → d}/docs/RESOURCES.md +0 -0
- data/tracks/{dlang → d}/docs/TESTS.md +0 -0
- data/tracks/{dlang → d}/exercises/bob/dub.sdl +0 -0
- data/tracks/{dlang → d}/exercises/bob/example/bob.d +0 -0
- data/tracks/{dlang → d}/exercises/bob/source/bob.d +0 -0
- data/tracks/{dlang → d}/exercises/circular-buffer/dub.sdl +0 -0
- data/tracks/{dlang → d}/exercises/circular-buffer/example/circular_buffer.d +1 -1
- data/tracks/{dlang → d}/exercises/circular-buffer/source/circular_buffer.d +2 -2
- data/tracks/{dlang → d}/exercises/crypto-square/dub.sdl +0 -0
- data/tracks/{dlang → d}/exercises/crypto-square/example/crypto_square.d +0 -0
- data/tracks/{dlang → d}/exercises/crypto-square/source/crypto_square.d +0 -0
- data/tracks/{dlang → d}/exercises/difference-of-squares/dub.sdl +0 -0
- data/tracks/{dlang → d}/exercises/difference-of-squares/example/difference_of_squares.d +0 -0
- data/tracks/{dlang → d}/exercises/difference-of-squares/source/difference_of_squares.d +0 -0
- data/tracks/{dlang → d}/exercises/etl/dub.sdl +0 -0
- data/tracks/{dlang → d}/exercises/etl/example/etl.d +2 -1
- data/tracks/{dlang → d}/exercises/etl/source/etl.d +0 -0
- data/tracks/{dlang → d}/exercises/gigasecond/dub.sdl +0 -0
- data/tracks/{dlang → d}/exercises/gigasecond/example/gigasecond.d +0 -0
- data/tracks/{dlang → d}/exercises/gigasecond/source/gigasecond.d +0 -0
- data/tracks/{dlang → d}/exercises/hamming/dub.sdl +0 -0
- data/tracks/{dlang → d}/exercises/hamming/example/hamming.d +2 -1
- data/tracks/{dlang → d}/exercises/hamming/source/hamming.d +2 -0
- data/tracks/{dlang → d}/exercises/hello-world/dub.sdl +0 -0
- data/tracks/{dlang → d}/exercises/hello-world/example/hello_world.d +0 -0
- data/tracks/{dlang → d}/exercises/hello-world/source/hello_world.d +0 -0
- data/tracks/{dlang → d}/exercises/leap/dub.sdl +0 -0
- data/tracks/{dlang → d}/exercises/leap/example/leap.d +0 -0
- data/tracks/{dlang → d}/exercises/leap/source/leap.d +0 -0
- data/tracks/{dlang → d}/exercises/nucleotide-count/dub.sdl +0 -0
- data/tracks/{dlang → d}/exercises/nucleotide-count/example/nucleotide_count.d +2 -1
- data/tracks/{dlang → d}/exercises/nucleotide-count/source/nucleotide_count.d +2 -0
- data/tracks/{dlang → d}/exercises/pangram/dub.sdl +0 -0
- data/tracks/{dlang → d}/exercises/pangram/example/pangram.d +0 -0
- data/tracks/{dlang → d}/exercises/pangram/source/pangram.d +0 -0
- data/tracks/{dlang → d}/exercises/raindrops/dub.sdl +0 -0
- data/tracks/{dlang → d}/exercises/raindrops/example/raindrops.d +0 -0
- data/tracks/{dlang → d}/exercises/raindrops/source/raindrops.d +0 -0
- data/tracks/{dlang → d}/exercises/react/dub.sdl +0 -0
- data/tracks/{dlang → d}/exercises/react/example/react.d +0 -0
- data/tracks/{dlang → d}/exercises/react/source/react.d +0 -0
- data/tracks/{dlang → d}/exercises/rna-transcription/dub.sdl +0 -0
- data/tracks/{dlang → d}/exercises/rna-transcription/example/rna_transcription.d +4 -1
- data/tracks/{dlang → d}/exercises/rna-transcription/source/rna_transcription.d +1 -1
- data/tracks/{dlang → d}/exercises/robot-name/dub.sdl +0 -0
- data/tracks/{dlang → d}/exercises/robot-name/example/robot_name.d +0 -0
- data/tracks/{dlang → d}/exercises/robot-name/source/robot_name.d +0 -0
- data/tracks/{dlang → d}/exercises/roman-numerals/dub.sdl +0 -0
- data/tracks/{dlang → d}/exercises/roman-numerals/example/roman_numerals.d +0 -0
- data/tracks/{dlang → d}/exercises/roman-numerals/source/roman_numerals.d +0 -0
- data/tracks/{dlang → d}/exercises/series/dub.sdl +0 -0
- data/tracks/{dlang → d}/exercises/series/example/series.d +1 -1
- data/tracks/{dlang → d}/exercises/series/source/series.d +1 -1
- data/tracks/{dlang → d}/exercises/triangle/dub.sdl +0 -0
- data/tracks/{dlang → d}/exercises/triangle/example/triangle.d +1 -2
- data/tracks/{dlang → d}/exercises/triangle/source/triangle.d +1 -3
- data/tracks/{dlang → d}/img/icon.png +0 -0
- data/tracks/{dartlang → dart}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- data/tracks/dart/.gitignore +24 -0
- data/tracks/dart/.travis.yml +27 -0
- data/tracks/dart/LICENSE +21 -0
- data/tracks/{dartlang → dart}/README.md +1 -1
- data/tracks/dart/analysis_options.yaml +7 -0
- data/tracks/dart/bin/fetch-configlet +32 -0
- data/tracks/dart/config.json +79 -0
- data/tracks/dart/docs/ABOUT.md +0 -0
- data/tracks/dart/docs/EXERCISE_README_INSERT.md +0 -0
- data/tracks/dart/docs/INSTALLATION.md +0 -0
- data/tracks/dart/docs/LEARNING.md +0 -0
- data/tracks/dart/docs/RESOURCES.md +0 -0
- data/tracks/dart/docs/TESTS.md +0 -0
- data/tracks/dart/exercises/bob/lib/bob.dart +3 -0
- data/tracks/dart/exercises/bob/lib/example.dart +17 -0
- data/tracks/dart/exercises/bob/pubspec.lock +281 -0
- data/tracks/dart/exercises/bob/pubspec.yaml +3 -0
- data/tracks/dart/exercises/bob/test/bob_test.dart +118 -0
- data/tracks/dart/exercises/difference-of-squares/lib/difference_of_squares.dart +3 -0
- data/tracks/dart/exercises/difference-of-squares/lib/example.dart +13 -0
- data/tracks/dart/exercises/difference-of-squares/pubspec.lock +281 -0
- data/tracks/dart/exercises/difference-of-squares/pubspec.yaml +3 -0
- data/tracks/dart/exercises/difference-of-squares/test/difference_of_squares_test.dart +50 -0
- data/tracks/dart/exercises/gigasecond/lib/example.dart +7 -0
- data/tracks/dart/exercises/gigasecond/lib/gigasecond.dart +3 -0
- data/tracks/dart/exercises/gigasecond/pubspec.lock +281 -0
- data/tracks/dart/exercises/gigasecond/pubspec.yaml +3 -0
- data/tracks/dart/exercises/gigasecond/test/gigasecond_test.dart +39 -0
- data/tracks/dart/exercises/hamming/lib/example.dart +17 -0
- data/tracks/dart/exercises/hamming/lib/hamming.dart +3 -0
- data/tracks/dart/exercises/hamming/pubspec.lock +281 -0
- data/tracks/dart/exercises/hamming/pubspec.yaml +3 -0
- data/tracks/dart/exercises/hamming/test/hamming_test.dart +54 -0
- data/tracks/dart/exercises/hello-world/lib/example.dart +3 -0
- data/tracks/dart/exercises/hello-world/lib/hello_world.dart +5 -0
- data/tracks/dart/exercises/hello-world/pubspec.lock +281 -0
- data/tracks/dart/exercises/hello-world/pubspec.yaml +3 -0
- data/tracks/dart/exercises/hello-world/test/hello_world_test.dart +24 -0
- data/tracks/dart/exercises/leap/lib/example.dart +13 -0
- data/tracks/dart/exercises/leap/lib/leap.dart +3 -0
- data/tracks/dart/exercises/leap/pubspec.lock +281 -0
- data/tracks/dart/exercises/leap/pubspec.yaml +3 -0
- data/tracks/dart/exercises/leap/test/leap_test.dart +30 -0
- data/tracks/dart/exercises/rna-transcription/lib/example.dart +18 -0
- data/tracks/dart/exercises/rna-transcription/lib/rna_transcription.dart +3 -0
- data/tracks/dart/exercises/rna-transcription/pubspec.lock +281 -0
- data/tracks/dart/exercises/rna-transcription/pubspec.yaml +3 -0
- data/tracks/dart/exercises/rna-transcription/test/rna_transcription_test.dart +48 -0
- data/tracks/dart/img/.keep +0 -0
- data/tracks/dart/img/icon.png +0 -0
- data/tracks/dart/img/icon.svg +37 -0
- data/tracks/dart/pubspec.lock +287 -0
- data/tracks/dart/pubspec.yaml +8 -0
- data/tracks/dart/test/exercises_test.dart +90 -0
- data/tracks/dart/tool/create-exercise +124 -0
- data/tracks/delphi/README.md +1 -1
- data/tracks/delphi/exercises/bank-account/uBankAccountTests.pas +12 -10
- data/tracks/delphi/exercises/hamming/uHammingExample.pas +5 -5
- data/tracks/delphi/exercises/hamming/uHammingTests.pas +46 -48
- data/tracks/ecmascript/.babelrc +3 -0
- data/tracks/ecmascript/config.json +25 -1
- data/tracks/ecmascript/exercises/accumulate/package.json +59 -11
- data/tracks/ecmascript/exercises/acronym/package.json +59 -11
- data/tracks/ecmascript/exercises/all-your-base/package.json +59 -11
- data/tracks/ecmascript/exercises/allergies/package.json +59 -11
- data/tracks/ecmascript/exercises/alphametics/alphametics.spec.js +95 -0
- data/tracks/ecmascript/exercises/alphametics/example.js +99 -0
- data/tracks/ecmascript/exercises/alphametics/package.json +122 -0
- data/tracks/ecmascript/exercises/anagram/package.json +59 -11
- data/tracks/ecmascript/exercises/atbash-cipher/package.json +59 -11
- data/tracks/ecmascript/exercises/beer-song/package.json +59 -11
- data/tracks/ecmascript/exercises/binary-search-tree/package.json +59 -11
- data/tracks/ecmascript/exercises/binary-search/package.json +59 -11
- data/tracks/ecmascript/exercises/binary/package.json +59 -11
- data/tracks/ecmascript/exercises/bob/package.json +59 -11
- data/tracks/ecmascript/exercises/bracket-push/package.json +59 -11
- data/tracks/ecmascript/exercises/circular-buffer/package.json +59 -11
- data/tracks/ecmascript/exercises/clock/package.json +59 -11
- data/tracks/ecmascript/exercises/connect/package.json +59 -11
- data/tracks/ecmascript/exercises/crypto-square/package.json +59 -11
- data/tracks/ecmascript/exercises/custom-set/package.json +59 -11
- data/tracks/ecmascript/exercises/diamond/package.json +59 -11
- data/tracks/ecmascript/exercises/difference-of-squares/package.json +59 -11
- data/tracks/ecmascript/exercises/etl/package.json +59 -11
- data/tracks/ecmascript/exercises/flatten-array/example.js +11 -0
- data/tracks/ecmascript/exercises/flatten-array/flatten-array.spec.js +41 -0
- data/tracks/ecmascript/exercises/flatten-array/package.json +74 -0
- data/tracks/ecmascript/exercises/food-chain/package.json +59 -11
- data/tracks/ecmascript/exercises/gigasecond/package.json +59 -11
- data/tracks/ecmascript/exercises/grade-school/package.json +59 -11
- data/tracks/ecmascript/exercises/grains/package.json +59 -11
- data/tracks/ecmascript/exercises/hamming/package.json +59 -11
- data/tracks/ecmascript/exercises/hello-world/package.json +59 -11
- data/tracks/ecmascript/exercises/hexadecimal/package.json +59 -11
- data/tracks/ecmascript/exercises/isogram/package.json +59 -11
- data/tracks/ecmascript/exercises/kindergarten-garden/package.json +59 -11
- data/tracks/ecmascript/exercises/largest-series-product/package.json +59 -11
- data/tracks/ecmascript/exercises/leap/package.json +59 -11
- data/tracks/ecmascript/exercises/linked-list/package.json +59 -11
- data/tracks/ecmascript/exercises/list-ops/example.js +77 -0
- data/tracks/ecmascript/exercises/list-ops/list-ops.spec.js +133 -0
- data/tracks/ecmascript/exercises/list-ops/package.json +74 -0
- data/tracks/ecmascript/exercises/luhn/package.json +59 -11
- data/tracks/ecmascript/exercises/matrix/package.json +59 -11
- data/tracks/ecmascript/exercises/meetup/package.json +59 -11
- data/tracks/ecmascript/exercises/nth-prime/package.json +59 -11
- data/tracks/ecmascript/exercises/ocr-numbers/package.json +59 -11
- data/tracks/ecmascript/exercises/octal/package.json +59 -11
- data/tracks/ecmascript/exercises/package.json +6 -8
- data/tracks/ecmascript/exercises/palindrome-products/package.json +59 -11
- data/tracks/ecmascript/exercises/pangram/package.json +59 -11
- data/tracks/ecmascript/exercises/pascals-triangle/package.json +59 -11
- data/tracks/ecmascript/exercises/perfect-numbers/package.json +59 -11
- data/tracks/ecmascript/exercises/phone-number/package.json +59 -11
- data/tracks/ecmascript/exercises/pig-latin/package.json +59 -11
- data/tracks/ecmascript/exercises/prime-factors/package.json +59 -11
- data/tracks/ecmascript/exercises/pythagorean-triplet/package.json +59 -11
- data/tracks/ecmascript/exercises/queen-attack/package.json +59 -11
- data/tracks/ecmascript/exercises/raindrops/package.json +59 -11
- data/tracks/ecmascript/exercises/rna-transcription/package.json +59 -11
- data/tracks/ecmascript/exercises/robot-name/package.json +59 -11
- data/tracks/ecmascript/exercises/robot-simulator/package.json +59 -11
- data/tracks/ecmascript/exercises/roman-numerals/package.json +59 -11
- data/tracks/ecmascript/exercises/saddle-points/package.json +59 -11
- data/tracks/ecmascript/exercises/say/package.json +59 -11
- data/tracks/ecmascript/exercises/scrabble-score/package.json +59 -11
- data/tracks/ecmascript/exercises/secret-handshake/package.json +59 -11
- data/tracks/ecmascript/exercises/series/package.json +59 -11
- data/tracks/ecmascript/exercises/sieve/package.json +59 -11
- data/tracks/ecmascript/exercises/simple-cipher/package.json +59 -11
- data/tracks/ecmascript/exercises/space-age/package.json +59 -11
- data/tracks/ecmascript/exercises/strain/package.json +59 -11
- data/tracks/ecmascript/exercises/sum-of-multiples/package.json +59 -11
- data/tracks/ecmascript/exercises/triangle/package.json +59 -11
- data/tracks/ecmascript/exercises/trinary/package.json +59 -11
- data/tracks/ecmascript/exercises/two-bucket/package.json +59 -11
- data/tracks/ecmascript/exercises/word-count/package.json +59 -11
- data/tracks/ecmascript/exercises/wordy/package.json +59 -11
- data/tracks/ecmascript/package-lock.json +2835 -0
- data/tracks/ecmascript/package.json +59 -11
- data/tracks/elixir/config.json +7 -0
- data/tracks/elixir/exercises/collatz-conjecture/collatz_conjecture.exs +12 -0
- data/tracks/elixir/exercises/collatz-conjecture/collatz_conjecture_test.exs +54 -0
- data/tracks/elixir/exercises/collatz-conjecture/example.exs +20 -0
- data/tracks/erlang/.github/stale.yml +2 -0
- data/tracks/erlang/exercises/rna-transcription/test/rna_transcription_tests.erl +3 -3
- data/tracks/factor/docs/INSTALLATION.md +27 -18
- data/tracks/factor/docs/TESTS.md +10 -6
- data/tracks/fortran/README.md +1 -1
- data/tracks/fortran/config.json +1 -1
- data/tracks/go/exercises/clock/.meta/gen.go +58 -65
- data/tracks/go/exercises/clock/cases_test.go +0 -4
- data/tracks/go/gen/gen.go +4 -0
- data/tracks/go/gen/property.go +70 -0
- data/tracks/groovy/README.md +1 -1
- data/tracks/groovy/config.json +2 -4
- data/tracks/groovy/exercises/roman-numerals/Example.groovy +10 -10
- data/tracks/groovy/exercises/roman-numerals/Roman.groovy +33 -0
- data/tracks/groovy/exercises/roman-numerals/RomanSpec.groovy +35 -0
- data/tracks/haskell/bin/test-example +7 -3
- data/tracks/haskell/bin/test-stub +5 -1
- data/tracks/haskell/config.json +6 -0
- data/tracks/haskell/exercises/pangram/package.yaml +1 -1
- data/tracks/haskell/exercises/pangram/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/simple-linked-list/test/Tests.hs +4 -4
- data/tracks/haskell/exercises/spiral-matrix/examples/success-standard/package.yaml +16 -0
- data/tracks/haskell/exercises/spiral-matrix/examples/success-standard/src/Spiral.hs +17 -0
- data/tracks/haskell/exercises/spiral-matrix/package.yaml +20 -0
- data/tracks/haskell/exercises/spiral-matrix/src/Spiral.hs +4 -0
- data/tracks/haskell/exercises/spiral-matrix/stack.yaml +1 -0
- data/tracks/haskell/exercises/spiral-matrix/test/Tests.hs +40 -0
- data/tracks/haxe/README.md +1 -1
- data/tracks/haxe/config.json +1 -1
- data/tracks/java/CONTRIBUTING.md +8 -0
- data/tracks/java/POLICIES.md +2 -2
- data/tracks/java/README.md +9 -9
- data/tracks/java/config.json +40 -5
- data/tracks/java/docs/ABOUT.md +1 -1
- data/tracks/java/docs/MAINTAINING.md +1 -1
- data/tracks/java/exercises/bank-account/HINTS.md +11 -0
- data/tracks/java/exercises/bank-account/build.gradle +18 -0
- data/tracks/java/exercises/bank-account/src/example/java/BankAccount.java +53 -0
- data/tracks/java/exercises/bank-account/src/example/java/BankAccountActionInvalidException.java +6 -0
- data/tracks/java/exercises/bank-account/src/main/java/BankAccountActionInvalidException.java +6 -0
- data/tracks/java/exercises/bank-account/src/test/java/BankAccountTest.java +201 -0
- data/tracks/java/exercises/clock/{HINT.md → HINTS.md} +0 -0
- data/tracks/java/exercises/food-chain/build.gradle +17 -0
- data/tracks/java/exercises/food-chain/src/example/java/FoodChain.java +77 -0
- data/tracks/java/exercises/food-chain/src/main/java/.keep +0 -0
- data/tracks/java/exercises/food-chain/src/test/java/FoodChainTest.java +204 -0
- data/tracks/java/exercises/hamming/src/test/java/HammingTest.java +68 -26
- data/tracks/java/exercises/hello-world/HINTS.md +4 -0
- data/tracks/java/exercises/hello-world/TUTORIAL.md +111 -395
- data/tracks/java/exercises/hello-world/src/example/java/Greeter.java +7 -0
- data/tracks/java/exercises/hello-world/src/main/java/{HelloWorld.java → Greeter.java} +4 -2
- data/tracks/java/exercises/hello-world/src/test/java/GreeterTest.java +12 -0
- data/tracks/java/exercises/isogram/{HINT.md → HINTS.md} +0 -0
- data/tracks/java/exercises/kindergarten-garden/src/test/java/KindergartenGardenTest.java +4 -4
- data/tracks/java/exercises/minesweeper/src/example/java/MinesweeperBoard.java +5 -41
- data/tracks/java/exercises/minesweeper/src/test/java/MinesweeperBoardTest.java +39 -90
- data/tracks/java/exercises/palindrome-products/src/test/java/PalindromeCalculatorTest.java +3 -1
- data/tracks/java/exercises/pangram/src/test/java/PangramCheckerTest.java +8 -18
- data/tracks/java/exercises/perfect-numbers/src/test/java/NaturalNumberTest.java +0 -1
- data/tracks/java/exercises/poker/build.gradle +18 -0
- data/tracks/java/exercises/poker/src/example/java/Card.java +25 -0
- data/tracks/java/exercises/poker/src/example/java/Hand.java +104 -0
- data/tracks/java/exercises/poker/src/example/java/Poker.java +27 -0
- data/tracks/java/exercises/poker/src/main/java/Poker.java +2 -0
- data/tracks/java/exercises/poker/src/test/java/PokerTest.java +164 -0
- data/tracks/java/exercises/settings.gradle +5 -0
- data/tracks/java/exercises/simple-cipher/{HINT.md → HINTS.md} +0 -0
- data/tracks/java/exercises/transpose/build.gradle +17 -0
- data/tracks/java/exercises/transpose/src/example/java/Transpose.java +41 -0
- data/tracks/java/exercises/transpose/src/main/java/.keep +0 -0
- data/tracks/java/exercises/transpose/src/test/java/TransposeTest.java +264 -0
- data/tracks/java/exercises/two-fer/HINTS.md +38 -0
- data/tracks/java/exercises/two-fer/build.gradle +17 -0
- data/tracks/java/exercises/two-fer/src/example/java/Twofer.java +5 -0
- data/tracks/java/exercises/two-fer/src/main/java/Twofer.java +5 -0
- data/tracks/java/exercises/two-fer/src/test/java/TwoferTest.java +41 -0
- data/tracks/javascript/config.json +9 -0
- data/tracks/javascript/exercises/hello-world/HINTS.md +10 -27
- data/tracks/javascript/exercises/hello-world/hello-world.js +1 -1
- data/tracks/javascript/exercises/hello-world/hello-world.spec.js +2 -10
- data/tracks/javascript/exercises/phone-number/example.js +2 -2
- data/tracks/javascript/exercises/phone-number/phone-number.spec.js +51 -46
- data/tracks/javascript/exercises/simple-linked-list/example.js +119 -0
- data/tracks/javascript/exercises/simple-linked-list/simple-linked-list.spec.js +160 -0
- data/tracks/julia/config.json +11 -0
- data/tracks/julia/exercises/complex-numbers/HINTS.md +11 -0
- data/tracks/julia/exercises/complex-numbers/complex-numbers.jl +0 -0
- data/tracks/julia/exercises/complex-numbers/example.jl +41 -0
- data/tracks/julia/exercises/complex-numbers/runtests.jl +74 -0
- data/tracks/kotlin/README.md +8 -8
- data/tracks/kotlin/bin/journey-test.sh +1 -1
- data/tracks/kotlin/exercises/allergies/src/example/kotlin/Allergen.kt +1 -0
- data/tracks/kotlin/exercises/hamming/src/test/kotlin/HammingTest.kt +64 -14
- data/tracks/kotlin/exercises/hello-world/TUTORIAL.md +1 -2
- data/tracks/kotlin/exercises/pangram/src/test/kotlin/PangramTest.kt +5 -9
- data/tracks/kotlin/exercises/phone-number/src/example/kotlin/PhoneNumber.kt +1 -1
- data/tracks/kotlin/exercises/phone-number/src/test/kotlin/PhoneNumberTest.kt +21 -13
- data/tracks/kotlin/exercises/rna-transcription/src/test/kotlin/RnaTranscriptionTest.kt +15 -18
- data/tracks/kotlin/gradle/wrapper/gradle-wrapper.jar +0 -0
- data/tracks/kotlin/gradle/wrapper/gradle-wrapper.properties +2 -2
- data/tracks/nasm/config.json +1 -1
- data/tracks/nim/README.md +2 -2
- data/tracks/nim/config.json +1 -1
- data/tracks/ocaml/exercises/all-your-base/test.ml +8 -8
- data/tracks/ocaml/exercises/bowling/test.ml +14 -15
- data/tracks/ocaml/exercises/hamming/test.ml +3 -3
- data/tracks/ocaml/tools/test-generator/templates/ocaml/bowling/test.ml +1 -1
- data/tracks/perl5/.travis.yml +1 -1
- data/tracks/perl5/README.md +1 -1
- data/tracks/perl5/bin/README.md +35 -0
- data/tracks/perl5/bin/cpanfile +4 -0
- data/tracks/perl5/bin/exercise-gen.pl +60 -0
- data/tracks/perl5/config.json +7 -0
- data/tracks/perl5/docs/INSTALLATION.md +23 -3
- data/tracks/perl5/exercises/bob/Bob.pm +4 -17
- data/tracks/perl5/exercises/bob/Example.pm +10 -11
- data/tracks/perl5/exercises/bob/bob.t +198 -51
- data/tracks/perl5/exercises/bob/example.yaml +41 -0
- data/tracks/perl5/exercises/hello-world/Example.pm +10 -0
- data/tracks/perl5/exercises/hello-world/HelloWorld.pm +10 -0
- data/tracks/perl5/exercises/hello-world/example.yaml +33 -0
- data/tracks/perl5/exercises/hello-world/hello-world.t +64 -0
- data/tracks/perl5/exercises/leap/Example.pm +9 -8
- data/tracks/perl5/exercises/leap/Leap.pm +11 -0
- data/tracks/perl5/exercises/leap/example.yaml +41 -0
- data/tracks/perl5/exercises/leap/leap.t +74 -17
- data/tracks/perl5/templates/module.mustache +8 -0
- data/tracks/perl5/templates/test.mustache +58 -0
- data/tracks/perl6/.travis.yml +1 -1
- data/tracks/perl6/README.md +1 -1
- data/tracks/perl6/bin/README.md +3 -3
- data/tracks/perl6/bin/exercise-gen.pl6 +2 -2
- data/tracks/perl6/exercises/all-your-base/all-your-base.t +6 -4
- data/tracks/perl6/exercises/allergies/allergies.t +6 -4
- data/tracks/perl6/exercises/anagram/anagram.t +6 -4
- data/tracks/perl6/exercises/atbash-cipher/atbash-cipher.t +6 -4
- data/tracks/perl6/exercises/bob/bob.t +6 -4
- data/tracks/perl6/exercises/clock/clock.t +6 -4
- data/tracks/perl6/exercises/flatten-array/flatten-array.t +6 -4
- data/tracks/perl6/exercises/grains/grains.t +6 -4
- data/tracks/perl6/exercises/hello-world/hello-world.t +6 -4
- data/tracks/perl6/exercises/leap/leap.t +6 -4
- data/tracks/perl6/exercises/luhn/luhn.t +6 -4
- data/tracks/perl6/exercises/phone-number/phone-number.t +6 -4
- data/tracks/perl6/exercises/raindrops/raindrops.t +6 -4
- data/tracks/perl6/exercises/rna-transcription/rna-transcription.t +15 -13
- data/tracks/perl6/exercises/scrabble-score/scrabble-score.t +6 -4
- data/tracks/perl6/exercises/space-age/space-age.t +6 -4
- data/tracks/perl6/exercises/word-count/word-count.t +6 -4
- data/tracks/perl6/exercises/wordy/wordy.t +6 -4
- data/tracks/perl6/templates/test.mustache +8 -7
- data/tracks/plsql/config.json +1 -1
- data/tracks/prolog/README.md +6 -6
- data/tracks/prolog/config.json +1 -1
- data/tracks/r/bin/run_tests.R +18 -10
- data/tracks/r/exercises/anagram/test_anagram.R +1 -1
- data/tracks/r/exercises/bob/test_bob.R +1 -1
- data/tracks/r/exercises/difference-of-squares/test_difference-of-squares.R +1 -1
- data/tracks/r/exercises/grains/test_grains.R +1 -1
- data/tracks/r/exercises/hamming/test_hamming.R +1 -1
- data/tracks/r/exercises/hello-world/test_hello-world.R +1 -1
- data/tracks/r/exercises/isogram/test_isogram.R +1 -1
- data/tracks/r/exercises/largest-series-product/test_largest-series-product.R +1 -1
- data/tracks/r/exercises/leap/test_leap.R +1 -1
- data/tracks/r/exercises/luhn/test_luhn.R +1 -1
- data/tracks/r/exercises/pascals-triangle/test_pascals-triangle.R +1 -1
- data/tracks/r/exercises/perfect-numbers/example.R +17 -1
- data/tracks/r/exercises/perfect-numbers/test_perfect-numbers.R +50 -33
- data/tracks/r/exercises/phone-number/test_phone-number.R +1 -1
- data/tracks/r/exercises/prime-factors/test_prime-factors.R +1 -1
- data/tracks/r/exercises/raindrops/test_raindrops.R +1 -1
- data/tracks/r/exercises/rna-transcription/test_rna-transcription.R +9 -9
- data/tracks/r/exercises/rotational-cipher/test_rotational-cipher.R +1 -1
- data/tracks/r/exercises/scrabble-score/test_scrabble-score.R +1 -1
- data/tracks/r/exercises/secret-handshake/test_secret-handshake.R +1 -1
- data/tracks/r/exercises/sieve/test_sieve.R +1 -1
- data/tracks/r/exercises/space-age/test_space-age.R +1 -1
- data/tracks/r/exercises/sum-of-multiples/test_sum-of-multiples.R +1 -1
- data/tracks/r/exercises/tournament/test_tournament.R +1 -1
- data/tracks/r/exercises/word-count/test_word-count.R +1 -1
- data/tracks/ruby/README.md +9 -9
- data/tracks/ruby/config.json +12 -0
- data/tracks/ruby/exercises/collatz-conjecture/.meta/.version +1 -0
- data/tracks/ruby/exercises/collatz-conjecture/.meta/generator/collatz_conjecture_case.rb +31 -0
- data/tracks/ruby/exercises/collatz-conjecture/.meta/solutions/collatz_conjecture.rb +22 -0
- data/tracks/ruby/exercises/collatz-conjecture/collatz_conjecture_test.rb +58 -0
- data/tracks/ruby/lib/generator/command_line.rb +6 -7
- data/tracks/ruby/lib/generator/command_line/generator_optparser.rb +2 -2
- data/tracks/ruby/lib/generator/files/metadata_files.rb +3 -3
- data/tracks/ruby/lib/generator/files/track_files.rb +22 -3
- data/tracks/ruby/lib/generator/implementation.rb +7 -5
- data/tracks/ruby/lib/generator/repository.rb +12 -0
- data/tracks/ruby/lib/generator/template_values.rb +1 -1
- data/tracks/ruby/lib/helper.rb +1 -1
- data/tracks/ruby/test/generator/command_line/generator_optparser_test.rb +2 -2
- data/tracks/ruby/test/generator/command_line_test.rb +2 -2
- data/tracks/ruby/test/generator/files/metadata_files_test.rb +2 -2
- data/tracks/ruby/test/generator/files/track_files_test.rb +9 -4
- data/tracks/ruby/test/generator/implementation_test.rb +11 -4
- data/tracks/ruby/test/generator/repository_test.rb +10 -0
- data/tracks/ruby/test/generator/template_values_test.rb +2 -4
- data/tracks/rust/exercises/bob/Cargo.toml +1 -1
- data/tracks/rust/exercises/bob/example.rs +4 -3
- data/tracks/rust/exercises/bob/tests/bob.rs +110 -9
- data/tracks/scala/config.json +0 -1
- data/tracks/scala/exercises/anagram/example.scala +7 -7
- data/tracks/scala/exercises/anagram/src/test/scala/AnagramTest.scala +73 -46
- data/tracks/scala/exercises/etl/example.scala +1 -1
- data/tracks/scala/exercises/etl/src/test/scala/EtlTest.scala +20 -34
- data/tracks/scala/exercises/grains/src/test/scala/GrainsTest.scala +21 -14
- data/tracks/scala/exercises/secret-handshake/example.scala +3 -3
- data/tracks/scala/exercises/secret-handshake/src/test/scala/SecretHandshakeTest.scala +28 -29
- data/tracks/scala/exercises/sieve/example.scala +1 -1
- data/tracks/scala/exercises/sieve/src/test/scala/SieveTest.scala +25 -23
- data/tracks/scala/exercises/triangle/example.scala +6 -22
- data/tracks/scala/exercises/triangle/src/test/scala/TriangleTest.scala +66 -19
- data/tracks/scala/testgen/src/main/scala/AnagramTestGenerator.scala +15 -0
- data/tracks/scala/testgen/src/main/scala/EtlTestGenerator.scala +52 -0
- data/tracks/scala/testgen/src/main/scala/GrainsTestGenerator.scala +50 -0
- data/tracks/scala/testgen/src/main/scala/SecretHandshakeTestGenerator.scala +15 -0
- data/tracks/scala/testgen/src/main/scala/SieveTestGenerator.scala +15 -0
- data/tracks/scala/testgen/src/main/scala/TriangleTestGenerator.scala +37 -0
- data/tracks/scala/testgen/src/main/scala/testgen/TestSuiteBuilder.scala +3 -0
- data/tracks/scheme/README.org +2 -2
- data/tracks/scheme/config.json +1 -1
- data/tracks/smalltalk/.gitignore +4 -0
- data/tracks/smalltalk/.travis.yml +5 -0
- data/tracks/smalltalk/LICENSE +21 -0
- data/tracks/smalltalk/README.md +11 -0
- data/tracks/smalltalk/bin/fetch-configlet +32 -0
- data/tracks/smalltalk/config.json +16 -0
- data/tracks/smalltalk/docs/ABOUT.md +0 -0
- data/tracks/smalltalk/docs/EXERCISE_README_INSERT.md +0 -0
- data/tracks/smalltalk/docs/INSTALLATION.md +0 -0
- data/tracks/smalltalk/docs/LEARNING.md +0 -0
- data/tracks/smalltalk/docs/RESOURCES.md +0 -0
- data/tracks/smalltalk/docs/TESTS.md +0 -0
- data/tracks/smalltalk/exercises/.keep +0 -0
- data/tracks/smalltalk/img/.keep +0 -0
- data/tracks/sml/config.json +1 -8
- data/tracks/tcl/README.md +1 -1
- data/tracks/tcl/config.json +1 -1
- data/tracks/teco/config.json +1 -1
- data/tracks/typescript/Makefile +1 -1
- data/tracks/typescript/appveyor.yml +18 -0
- data/tracks/typescript/common/package.json +7 -7
- data/tracks/typescript/common/tsconfig.json +1 -0
- data/tracks/typescript/common/yarn.lock +718 -1152
- data/tracks/typescript/config.json +45 -42
- data/tracks/typescript/exercises/anagram/package.json +7 -7
- data/tracks/typescript/exercises/anagram/tsconfig.json +1 -0
- data/tracks/typescript/exercises/anagram/yarn.lock +718 -1152
- data/tracks/typescript/exercises/beer-song/package.json +7 -7
- data/tracks/typescript/exercises/beer-song/tsconfig.json +1 -0
- data/tracks/typescript/exercises/beer-song/yarn.lock +718 -1152
- data/tracks/typescript/exercises/bob/package.json +7 -7
- data/tracks/typescript/exercises/bob/tsconfig.json +1 -0
- data/tracks/typescript/exercises/bob/yarn.lock +718 -1152
- data/tracks/typescript/exercises/difference-of-squares/package.json +7 -7
- data/tracks/typescript/exercises/difference-of-squares/tsconfig.json +1 -0
- data/tracks/typescript/exercises/difference-of-squares/yarn.lock +718 -1152
- data/tracks/typescript/exercises/etl/package.json +7 -7
- data/tracks/typescript/exercises/etl/tsconfig.json +1 -0
- data/tracks/typescript/exercises/etl/yarn.lock +718 -1152
- data/tracks/typescript/exercises/food-chain/package.json +7 -7
- data/tracks/typescript/exercises/food-chain/tsconfig.json +1 -0
- data/tracks/typescript/exercises/food-chain/yarn.lock +718 -1152
- data/tracks/typescript/exercises/gigasecond/package.json +7 -7
- data/tracks/typescript/exercises/gigasecond/tsconfig.json +1 -0
- data/tracks/typescript/exercises/gigasecond/yarn.lock +718 -1152
- data/tracks/typescript/exercises/grade-school/package.json +7 -7
- data/tracks/typescript/exercises/grade-school/tsconfig.json +1 -0
- data/tracks/typescript/exercises/grade-school/yarn.lock +718 -1152
- data/tracks/typescript/exercises/hamming/package.json +7 -7
- data/tracks/typescript/exercises/hamming/tsconfig.json +1 -0
- data/tracks/typescript/exercises/hamming/yarn.lock +718 -1152
- data/tracks/typescript/exercises/hello-world/package.json +7 -7
- data/tracks/typescript/exercises/hello-world/tsconfig.json +1 -0
- data/tracks/typescript/exercises/hello-world/yarn.lock +718 -1152
- data/tracks/typescript/exercises/leap/package.json +7 -7
- data/tracks/typescript/exercises/leap/tsconfig.json +1 -0
- data/tracks/typescript/exercises/leap/yarn.lock +718 -1152
- data/tracks/typescript/exercises/pangram/package.json +7 -7
- data/tracks/typescript/exercises/pangram/tsconfig.json +1 -0
- data/tracks/typescript/exercises/pangram/yarn.lock +718 -1152
- data/tracks/typescript/exercises/phone-number/package.json +7 -7
- data/tracks/typescript/exercises/phone-number/tsconfig.json +1 -0
- data/tracks/typescript/exercises/phone-number/yarn.lock +718 -1152
- data/tracks/typescript/exercises/raindrops/package.json +7 -7
- data/tracks/typescript/exercises/raindrops/tsconfig.json +1 -0
- data/tracks/typescript/exercises/raindrops/yarn.lock +718 -1152
- data/tracks/typescript/exercises/rna-transcription/package.json +7 -7
- data/tracks/typescript/exercises/rna-transcription/tsconfig.json +1 -0
- data/tracks/typescript/exercises/rna-transcription/yarn.lock +718 -1152
- data/tracks/typescript/exercises/robot-name/package.json +7 -7
- data/tracks/typescript/exercises/robot-name/robot-name.test.ts +0 -5
- data/tracks/typescript/exercises/robot-name/tsconfig.json +1 -0
- data/tracks/typescript/exercises/robot-name/yarn.lock +718 -1152
- data/tracks/typescript/exercises/say/package.json +7 -7
- data/tracks/typescript/exercises/say/tsconfig.json +1 -0
- data/tracks/typescript/exercises/say/yarn.lock +718 -1152
- data/tracks/typescript/exercises/scrabble-score/package.json +7 -7
- data/tracks/typescript/exercises/scrabble-score/scrabble-score.example.ts +1 -1
- data/tracks/typescript/exercises/scrabble-score/tsconfig.json +1 -0
- data/tracks/typescript/exercises/scrabble-score/yarn.lock +718 -1152
- data/tracks/typescript/exercises/space-age/package.json +7 -7
- data/tracks/typescript/exercises/space-age/tsconfig.json +1 -0
- data/tracks/typescript/exercises/space-age/yarn.lock +718 -1152
- data/tracks/typescript/exercises/word-count/package.json +7 -7
- data/tracks/typescript/exercises/word-count/tsconfig.json +1 -0
- data/tracks/typescript/exercises/word-count/yarn.lock +718 -1152
- data/tracks/typescript/exercises/wordy/package.json +7 -7
- data/tracks/typescript/exercises/wordy/tsconfig.json +1 -0
- data/tracks/typescript/exercises/wordy/yarn.lock +718 -1152
- data/tracks/vimscript/exercises/rna-transcription/example.vim +1 -1
- data/tracks/vimscript/exercises/rna-transcription/rna_transcription.vader +40 -16
- data/tracks/vimscript/exercises/rna-transcription/rna_transcription.vim +2 -4
- metadata +670 -497
- data/fixtures/tracks/animal/exercises/fish/included-via-symlink.txt +0 -1
- data/tracks/csharp/generators/Classes/TestClass.cs +0 -15
- data/tracks/csharp/generators/Classes/TestClassNameTransformer.cs +0 -9
- data/tracks/csharp/generators/Classes/TestClassRenderer.cs +0 -40
- data/tracks/csharp/generators/Classes/TestedClassNameTransformer.cs +0 -9
- data/tracks/csharp/generators/Data/CanonicalDataCase.cs +0 -24
- data/tracks/csharp/generators/Data/CanonicalDataCaseJsonConverter.cs +0 -32
- data/tracks/csharp/generators/Data/CanonicalDataValue.cs +0 -24
- data/tracks/csharp/generators/Data/ExerciseCollection.cs +0 -23
- data/tracks/csharp/generators/Exercises/AcronymExercise.cs +0 -20
- data/tracks/csharp/generators/Exercises/AtbashCipherExercise.cs +0 -20
- data/tracks/csharp/generators/Exercises/BeerSongExercise.cs +0 -33
- data/tracks/csharp/generators/Exercises/BooleanExercise.cs +0 -14
- data/tracks/csharp/generators/Exercises/EqualityExercise.cs +0 -19
- data/tracks/csharp/generators/Exercises/Exercise.cs +0 -81
- data/tracks/csharp/generators/Exercises/FoodChainExercise.cs +0 -27
- data/tracks/csharp/generators/Exercises/HelloWorldExercise.cs +0 -9
- data/tracks/csharp/generators/Exercises/IsogramExercise.cs +0 -9
- data/tracks/csharp/generators/Exercises/LeapExercise.cs +0 -9
- data/tracks/csharp/generators/Exercises/LuhnExercise.cs +0 -9
- data/tracks/csharp/generators/Exercises/NthPrimeExercise.cs +0 -22
- data/tracks/csharp/generators/Exercises/PerfectNumbersExercise.cs +0 -29
- data/tracks/csharp/generators/Exercises/PigLatinExercise.cs +0 -9
- data/tracks/csharp/generators/Exercises/RaindropsExercise.cs +0 -20
- data/tracks/csharp/generators/Exercises/RomanNumeralsExercise.cs +0 -30
- data/tracks/csharp/generators/Exercises/RotationalCipherExercise.cs +0 -23
- data/tracks/csharp/generators/Exercises/WordyExercise.cs +0 -20
- data/tracks/csharp/generators/Helpers/StringExtensions.cs +0 -8
- data/tracks/csharp/generators/Helpers/To.cs +0 -13
- data/tracks/csharp/generators/Methods/BooleanTestMethodGenerator.cs +0 -32
- data/tracks/csharp/generators/Methods/EqualityTestMethodGenerator.cs +0 -49
- data/tracks/csharp/generators/Methods/ExceptionTestMethodGenerator.cs +0 -30
- data/tracks/csharp/generators/Methods/TestMethod.cs +0 -12
- data/tracks/csharp/generators/Methods/TestMethodData.cs +0 -12
- data/tracks/csharp/generators/Methods/TestMethodGenerator.cs +0 -80
- data/tracks/csharp/generators/Methods/TestMethodNameTransformer.cs +0 -23
- data/tracks/csharp/generators/Methods/TestMethodOptions.cs +0 -15
- data/tracks/csharp/generators/Methods/TestMethodRenderer.cs +0 -26
- data/tracks/csharp/generators/Methods/TestedMethodNameTransformer.cs +0 -9
- data/tracks/groovy/exercises/roman-numerals/RomanTest.groovy +0 -96
- data/tracks/java/exercises/hello-world/GETTING_STARTED.md +0 -54
- data/tracks/java/exercises/hello-world/HINT.md +0 -7
- data/tracks/java/exercises/hello-world/src/example/java/HelloWorld.java +0 -9
- data/tracks/java/exercises/hello-world/src/test/java/HelloWorldTest.java +0 -32
- data/tracks/kotlin/exercises/allergies/src/example/kotlin/Allergen.kt +0 -10
|
@@ -1,39 +1,42 @@
|
|
|
1
|
-
|
|
2
|
-
https://github.com/exercism/java/blob/master/exercises/hello-world/TUTORIAL.md
|
|
1
|
+
# Table of Contents
|
|
3
2
|
|
|
3
|
+
* [Introduction](#introduction)
|
|
4
|
+
* [Exercise Structure](#exercise-structure)
|
|
4
5
|
* [Solving "Hello, World!"](#solving-hello-world)
|
|
5
|
-
* [Reading Gradle output](#reading-gradle-output)
|
|
6
|
-
* [Fixing the first failing test](#fixing-the-first-failing-test)
|
|
7
|
-
* [Enabling and fixing the second test](#enabling-and-fixing-the-second-test)
|
|
8
|
-
* [Enabling the last test](#enabling-the-last-test)
|
|
9
|
-
* [Refactoring](#refactoring)
|
|
10
6
|
* [Submitting your first iteration](#submitting-your-first-iteration)
|
|
11
7
|
* [Next Steps](#next-steps)
|
|
12
|
-
* [Review (and comment on) others' submissions to this exercise](#review-and-comment-on-others-submissions-to-this-exercise)
|
|
13
|
-
* [Extend an exercise](#extend-an-exercise)
|
|
14
8
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
# Solving "Hello, World!"
|
|
9
|
+
# Introduction
|
|
18
10
|
|
|
19
11
|
Welcome to the first exercise on the Java track!
|
|
20
12
|
|
|
21
|
-
This is a step-by-step guide to solving this exercise.
|
|
13
|
+
This document is a step-by-step guide to solving this exercise. The
|
|
14
|
+
instructions should work equally well on Windows, Mac OS X and Linux.
|
|
22
15
|
|
|
23
|
-
|
|
24
|
-
|
|
16
|
+
Even if you are already familiar with Java basics, stepping through this guide
|
|
17
|
+
may be helpful as it will help you understand the output from the tool, Gradle,
|
|
18
|
+
that we use to compile and test our code, as well as introduce some of the
|
|
19
|
+
patterns common to all exercises in this track.
|
|
25
20
|
|
|
26
|
-
|
|
27
|
-
so now. For help with this, see: http://exercism.io/languages/java/installing
|
|
21
|
+
# Exercise Structure
|
|
28
22
|
|
|
29
|
-
|
|
23
|
+
When you fetch a new Java exercise, you will receive:
|
|
30
24
|
|
|
31
|
-
|
|
32
|
-
|
|
25
|
+
* __one or more test files__ (always). These live in the `src/test/java`
|
|
26
|
+
directory and define a set of tests that our solution must satisfy before we
|
|
27
|
+
can safely declare that it is working.
|
|
28
|
+
* __one or more starter files__ (initially). If provided, these live in the
|
|
29
|
+
`src/main/java` directory and define shells of the classes you will need
|
|
30
|
+
in order to solve the current problem.
|
|
33
31
|
|
|
34
|
-
|
|
32
|
+
# Solving "Hello, World!"
|
|
35
33
|
|
|
36
|
-
|
|
34
|
+
Before proceeding any further, make sure you have completed the required setup
|
|
35
|
+
steps described by the links below:
|
|
36
|
+
* [Installing Java](http://exercism.io/languages/java/installing);
|
|
37
|
+
* [Running the Tests (in Java)](http://exercism.io/languages/java/tests).
|
|
38
|
+
|
|
39
|
+
## Step 1: Run the tests against the starter solution
|
|
37
40
|
|
|
38
41
|
Use Gradle to run the tests:
|
|
39
42
|
|
|
@@ -51,8 +54,8 @@ This command does a lot and displays a bunch of stuff. Let's break it down...
|
|
|
51
54
|
|
|
52
55
|
Each line that begins with a colon (like `:compileJava`) is Gradle telling
|
|
53
56
|
us that it's starting that task. The first three tasks are about compiling
|
|
54
|
-
the source code of our
|
|
55
|
-
enough code for the solution
|
|
57
|
+
the source code of our _solution_. This exercise contains starter files with
|
|
58
|
+
just enough code for the solution to compile without requiring modification.
|
|
56
59
|
|
|
57
60
|
When a task is successful, it generally does not output anything. This is
|
|
58
61
|
why `:compileJava` and `:classes` do not produce any additional output.
|
|
@@ -60,7 +63,7 @@ why `:compileJava` and `:classes` do not produce any additional output.
|
|
|
60
63
|
|
|
61
64
|
So far, so good...
|
|
62
65
|
|
|
63
|
-
The next three tasks are about compiling source code of the
|
|
66
|
+
The next three tasks are about compiling source code of the _tests_.
|
|
64
67
|
|
|
65
68
|
```
|
|
66
69
|
:compileTestJava
|
|
@@ -74,425 +77,162 @@ running the task you asked it to: executing the tests against the solution.
|
|
|
74
77
|
```
|
|
75
78
|
:test
|
|
76
79
|
|
|
77
|
-
|
|
78
|
-
java.lang.
|
|
79
|
-
at
|
|
80
|
-
at
|
|
81
|
-
at org.junit.Assert.assertEquals(Assert.java:128)
|
|
82
|
-
at org.junit.Assert.assertEquals(Assert.java:147)
|
|
83
|
-
at HelloWorldTest.helloNoName(HelloWorldTest.java:10)
|
|
84
|
-
|
|
85
|
-
HelloWorldTest > helloSampleName SKIPPED
|
|
86
|
-
|
|
87
|
-
HelloWorldTest > helloAnotherSampleName SKIPPED
|
|
80
|
+
GreeterTest > testThatGreeterReturnsTheCorrectGreeting FAILED
|
|
81
|
+
java.lang.UnsupportedOperationException: Delete this statement and write your own implementation.
|
|
82
|
+
at getGreeting(Greeter.java:4)
|
|
83
|
+
at GreeterTest.testThatGreeterReturnsTheCorrectGreeting(GreeterTest.java:9)
|
|
88
84
|
|
|
89
|
-
|
|
85
|
+
1 tests completed, 1 failed
|
|
90
86
|
:test FAILED
|
|
91
87
|
|
|
92
88
|
FAILURE: Build failed with an exception.
|
|
93
89
|
|
|
94
90
|
* What went wrong:
|
|
95
91
|
Execution failed for task ':test'.
|
|
96
|
-
> There were failing tests. See the report at: file:///
|
|
92
|
+
> There were failing tests. See the report at: file:///home/<username>/hello-world/build/reports/tests/index.html
|
|
97
93
|
|
|
98
94
|
* Try:
|
|
99
95
|
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
|
|
100
96
|
|
|
101
97
|
BUILD FAILED
|
|
102
98
|
|
|
103
|
-
Total time:
|
|
99
|
+
Total time: 12.361 secs
|
|
104
100
|
```
|
|
105
101
|
|
|
106
|
-
Seeing the word "
|
|
107
|
-
something
|
|
108
|
-
|
|
102
|
+
Seeing the word "FAILED" might give you the impression you've done
|
|
103
|
+
something wrong. You haven't. This output is just a very verbose way of
|
|
104
|
+
telling us that the included test did not pass. This is expected - we haven't
|
|
105
|
+
written any code to help it pass yet!
|
|
109
106
|
|
|
110
107
|
Let's focus in on the important bits:
|
|
111
108
|
|
|
112
109
|
```
|
|
113
|
-
|
|
114
|
-
java.lang.
|
|
110
|
+
GreeterTest > testThatGreeterReturnsTheCorrectGreeting FAILED
|
|
111
|
+
java.lang.UnsupportedOperationException: Delete this statement and write your own implementation.
|
|
115
112
|
```
|
|
116
113
|
|
|
117
|
-
...is read: "Within the test class named `
|
|
118
|
-
`
|
|
119
|
-
|
|
120
|
-
|
|
114
|
+
...is read: "Within the test class named `GreeterTest`, the test method
|
|
115
|
+
`testThatGreeterReturnsTheCorrectGreeting` did not pass because an
|
|
116
|
+
`UnsupportedOperationException` was thrown with the message `Delete this
|
|
117
|
+
statement and write your own implementation.`."
|
|
121
118
|
|
|
122
|
-
The
|
|
123
|
-
|
|
119
|
+
The next line of the [stack trace](https://stackoverflow.com/questions/3988788/what-is-a-stack-trace-and-how-can-i-use-it-to-debug-my-application-errors)
|
|
120
|
+
tells us where this `UnsupportedOperationException` was thrown:
|
|
124
121
|
|
|
125
122
|
```
|
|
126
|
-
at
|
|
123
|
+
at getGreeting(Greeter.java:4)
|
|
127
124
|
```
|
|
128
125
|
|
|
129
|
-
Looks like
|
|
130
|
-
|
|
131
|
-
Knowing these two facts,
|
|
132
|
-
|
|
133
|
-
1. the return value was not what was expected, and
|
|
134
|
-
2. the failure was on line 10 of the test,
|
|
135
|
-
|
|
136
|
-
we can turn this failure into success.
|
|
137
|
-
|
|
138
|
-
|
|
126
|
+
Looks like it was on line 4 in the `Greeter.java` file. Let's update that line
|
|
127
|
+
as instructed, and try running the tests again.
|
|
139
128
|
|
|
140
|
-
##
|
|
129
|
+
## Step 2: Replace the `UnsupportedOperationException`
|
|
141
130
|
|
|
142
|
-
In your favorite text editor, open `src/
|
|
143
|
-
|
|
131
|
+
In your favorite text editor, open `src/main/java/Greeter.java`. You should
|
|
132
|
+
find the source of the exception encountered above on line 4:
|
|
144
133
|
|
|
145
134
|
```java
|
|
146
|
-
|
|
135
|
+
throw new UnsupportedOperationException("Delete this statement and write your own implementation.");
|
|
147
136
|
```
|
|
148
137
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
138
|
+
[`Exception`s](https://docs.oracle.com/javase/tutorial/essential/exceptions/)
|
|
139
|
+
are often used in Java to draw the attention of a developer when something goes
|
|
140
|
+
wrong. In our case, nothing is wrong per se; we just haven't written our
|
|
141
|
+
solution yet! The use of an
|
|
142
|
+
[`UnsupportedOperationException`](http://docs.oracle.com/javase/8/docs/api/?java/lang/UnsupportedOperationException.html)
|
|
143
|
+
in this situation is designed to remind us of exactly this fact. It effectively
|
|
144
|
+
says: "Your Code Goes Here!".
|
|
152
145
|
|
|
153
|
-
|
|
146
|
+
Delete the contents of line 4 and replace it with the following:
|
|
154
147
|
|
|
155
148
|
```java
|
|
156
|
-
|
|
157
|
-
public static String hello(String name) {
|
|
158
|
-
return null;
|
|
159
|
-
}
|
|
160
|
-
}
|
|
149
|
+
return null;
|
|
161
150
|
```
|
|
162
151
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
```java
|
|
166
|
-
public class HelloWorld {
|
|
167
|
-
public static String hello(String name) {
|
|
168
|
-
return "Hello, World!";
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
```
|
|
152
|
+
Now run `gradle test` again.
|
|
172
153
|
|
|
173
|
-
|
|
154
|
+
You should see a new error this time. Don't worry though, that still
|
|
155
|
+
represents forward progress!
|
|
174
156
|
|
|
175
157
|
```
|
|
176
|
-
|
|
177
|
-
:
|
|
178
|
-
:processResources UP-TO-DATE
|
|
179
|
-
:classes
|
|
180
|
-
:compileTestJava
|
|
181
|
-
:processTestResources UP-TO-DATE
|
|
182
|
-
:testClasses
|
|
183
|
-
:test
|
|
184
|
-
|
|
185
|
-
HelloWorldTest > helloAnotherSampleName SKIPPED
|
|
186
|
-
|
|
187
|
-
HelloWorldTest > helloNoName PASSED
|
|
188
|
-
|
|
189
|
-
HelloWorldTest > helloSampleName SKIPPED
|
|
190
|
-
|
|
191
|
-
BUILD SUCCESSFUL
|
|
192
|
-
|
|
193
|
-
Total time: 4.523 secs
|
|
158
|
+
GreeterTest > testThatGreeterReturnsTheCorrectGreeting FAILED
|
|
159
|
+
java.lang.AssertionError: expected:<Hello, World!> but was:<null>
|
|
194
160
|
```
|
|
195
161
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
With one win under our belt, we can turn our focus to some other messages
|
|
200
|
-
that we've been ignoring: the lines ending in "`SKIPPED`".
|
|
201
|
-
|
|
202
|
-
Each test suite contains a series of tests, all of which have been marked
|
|
203
|
-
to be skipped/ignored except the first one. We did this to help you focus
|
|
204
|
-
on getting one test running at a time.
|
|
205
|
-
|
|
206
|
-
Let's tackle the next test...
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
## Enabling and fixing the second test
|
|
162
|
+
...is read: "Within the test class named `GreeterTest`,
|
|
163
|
+
the test method `testThatGreeterReturnsTheCorrectGreeting` did not pass because
|
|
164
|
+
the solution did not satisfy an assertion."
|
|
211
165
|
|
|
212
|
-
|
|
166
|
+
Apparently, our test was expecting to see the string "Hello, World!", but it
|
|
167
|
+
received the value `null` instead.
|
|
213
168
|
|
|
214
|
-
|
|
169
|
+
The last line of the stack trace tells us exactly where this "unsatisfied
|
|
170
|
+
assertion" lives:
|
|
215
171
|
|
|
216
|
-
```java
|
|
217
|
-
...
|
|
218
|
-
@Test
|
|
219
|
-
@Ignore
|
|
220
|
-
public void helloSampleName() {
|
|
221
|
-
assertEquals("Hello, Alice!", HelloWorld.hello("Alice"));
|
|
222
|
-
}
|
|
223
|
-
...
|
|
224
172
|
```
|
|
225
|
-
|
|
226
|
-
When the JUnit test runner sees that `@Ignore` annotation on the test
|
|
227
|
-
method, it knows to skip over that test. Remove that line:
|
|
228
|
-
|
|
229
|
-
```java
|
|
230
|
-
...
|
|
231
|
-
@Test
|
|
232
|
-
public void helloSampleName() {
|
|
233
|
-
assertEquals("Hello, Alice!", HelloWorld.hello("Alice"));
|
|
234
|
-
}
|
|
235
|
-
...
|
|
173
|
+
at testThatGreeterReturnsTheCorrectGreeting(GreeterTest.java:9)
|
|
236
174
|
```
|
|
175
|
+
Looks like the mismatch was discovered on line 9 in the test file.
|
|
237
176
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
```sh
|
|
241
|
-
$ gradle test
|
|
242
|
-
...
|
|
243
|
-
:test
|
|
244
|
-
|
|
245
|
-
HelloWorldTest > helloNoName PASSED
|
|
177
|
+
Knowing these two facts:
|
|
246
178
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
at org.junit.Assert.assertEquals(Assert.java:125)
|
|
250
|
-
at org.junit.Assert.assertEquals(Assert.java:147)
|
|
251
|
-
at HelloWorldTest.helloSampleName(HelloWorldTest.java:16)
|
|
179
|
+
1. that the return value was not what was expected, and
|
|
180
|
+
2. that the failure was on line 9 of the test file,
|
|
252
181
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
3 tests completed, 1 failed, 1 skipped
|
|
256
|
-
...
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
The first test, `helloNoName()` continues to pass. We see that
|
|
260
|
-
`helloSampleName` -- the test we just un-`@Ignore`'d -- is now running and
|
|
261
|
-
failing. Yay, failing test! In fact, the "failure" message is just
|
|
262
|
-
describing the difference between what the program does now and what it
|
|
263
|
-
should do for us to call it "done."
|
|
182
|
+
we can turn this failure into success.
|
|
264
183
|
|
|
265
|
-
|
|
266
|
-
unleashed a new expectation: that our program incorporate a name given
|
|
267
|
-
into that greeting. When given the name "`Alice`", that's who should be
|
|
268
|
-
greeted instead of "`World`".
|
|
184
|
+
## Step 3: Fix the test!
|
|
269
185
|
|
|
270
|
-
|
|
186
|
+
Open `src/test/java/GreeterTest.java` and go to line 9. It reads:
|
|
271
187
|
|
|
272
188
|
```java
|
|
273
|
-
|
|
274
|
-
public static String hello(String name) {
|
|
275
|
-
return "Hello, World!";
|
|
276
|
-
}
|
|
277
|
-
}
|
|
189
|
+
assertEquals("Hello, World!", new Greeter().getGreeting());
|
|
278
190
|
```
|
|
279
191
|
|
|
280
|
-
|
|
281
|
-
|
|
192
|
+
The test is expecting that the method `getGreeting()` returns "Hello, World!".
|
|
193
|
+
Instead, `getGreeting()` is returning `null`. Let's fix that.
|
|
282
194
|
|
|
195
|
+
Open `src/main/java/Greeter.java`. It should look like this:
|
|
283
196
|
|
|
284
197
|
```java
|
|
285
|
-
|
|
286
|
-
public static String hello(String name) {
|
|
287
|
-
return "Hello, " + name + "!";
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
... and rerun the tests ...
|
|
198
|
+
class Greeter {
|
|
293
199
|
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
:test
|
|
297
|
-
|
|
298
|
-
HelloWorldTest > helloAnotherSampleName SKIPPED
|
|
299
|
-
|
|
300
|
-
HelloWorldTest > helloNoName FAILED
|
|
301
|
-
org.junit.ComparisonFailure: expected:<Hello, [World]!> but was:<Hello, []!>
|
|
302
|
-
at org.junit.Assert.assertEquals(Assert.java:125)
|
|
303
|
-
at org.junit.Assert.assertEquals(Assert.java:147)
|
|
304
|
-
at HelloWorldTest.helloNoName(HelloWorldTest.java:10)
|
|
305
|
-
|
|
306
|
-
HelloWorldTest > helloSampleName PASSED
|
|
307
|
-
|
|
308
|
-
3 tests completed, 1 failed, 1 skipped
|
|
309
|
-
```
|
|
310
|
-
|
|
311
|
-
Wait... didn't we just fix the test? Why is it failing? Take a closer look...
|
|
312
|
-
|
|
313
|
-
In fact, `helloSampleName()` *is* passing. It's just that at the same time,
|
|
314
|
-
we just inadvertently broke that first test: `helloNoName()`.
|
|
315
|
-
|
|
316
|
-
This is one tiny example of the benefit of maintaining a test suite: if we
|
|
317
|
-
use them to drive out our code, the second we break the program the tests
|
|
318
|
-
say so. Since we saw them passing just *before* our latest change,
|
|
319
|
-
whatever we *just* did most likely cause that regression.
|
|
320
|
-
|
|
321
|
-
Our latest change was making the greeting dependent on the name given. Our
|
|
322
|
-
first test expects that if either a blank string or null are given as the
|
|
323
|
-
name, then "`World`" should be substituted in. Let's implement that.
|
|
324
|
-
|
|
325
|
-
`src/main/java/HelloWorld.java`:
|
|
326
|
-
```java
|
|
327
|
-
public class HelloWorld {
|
|
328
|
-
public static String hello(String name) {
|
|
329
|
-
if(name == null || "".equals(name)) {
|
|
330
|
-
name = "World";
|
|
200
|
+
String getGreeting() {
|
|
201
|
+
return null;
|
|
331
202
|
}
|
|
332
|
-
return "Hello, " + name + "!";
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
```
|
|
336
|
-
|
|
337
|
-
... and re-run the tests ...
|
|
338
|
-
|
|
339
|
-
```
|
|
340
|
-
$ gradle test
|
|
341
|
-
...
|
|
342
|
-
:test
|
|
343
203
|
|
|
344
|
-
HelloWorldTest > helloNoName PASSED
|
|
345
|
-
|
|
346
|
-
HelloWorldTest > helloSampleName PASSED
|
|
347
|
-
|
|
348
|
-
HelloWorldTest > helloAnotherSampleName SKIPPED
|
|
349
|
-
|
|
350
|
-
BUILD SUCCESSFUL
|
|
351
|
-
|
|
352
|
-
Total time: 4.804 secs
|
|
353
|
-
```
|
|
354
|
-
|
|
355
|
-
Excellent! We're now (at least) two-thirds the way done. Just one more
|
|
356
|
-
test to go...
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
## Enabling the last test
|
|
361
|
-
|
|
362
|
-
(Re)open `src/test/java/HelloWorldTest.java` and find the last test:
|
|
363
|
-
|
|
364
|
-
```java
|
|
365
|
-
...
|
|
366
|
-
@Test
|
|
367
|
-
@Ignore
|
|
368
|
-
public void helloAnotherSampleName() {
|
|
369
|
-
assertEquals("Hello, Bob!", HelloWorld.hello("Bob"));
|
|
370
204
|
}
|
|
371
|
-
...
|
|
372
205
|
```
|
|
373
206
|
|
|
374
|
-
|
|
207
|
+
Remove the `return null` that we previously added, and instead return the
|
|
208
|
+
string our test was expecting:
|
|
375
209
|
|
|
376
210
|
```java
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
assertEquals("Hello, Bob!", HelloWorld.hello("Bob"));
|
|
381
|
-
}
|
|
382
|
-
...
|
|
211
|
+
String getGreeting() {
|
|
212
|
+
return "Hello, World!";
|
|
213
|
+
}
|
|
383
214
|
```
|
|
384
215
|
|
|
385
|
-
|
|
216
|
+
Save the file and run the tests again:
|
|
386
217
|
|
|
387
218
|
```
|
|
388
219
|
$ gradle test
|
|
389
|
-
:compileJava
|
|
220
|
+
:compileJava
|
|
390
221
|
:processResources UP-TO-DATE
|
|
391
|
-
:classes
|
|
222
|
+
:classes
|
|
392
223
|
:compileTestJava
|
|
393
224
|
:processTestResources UP-TO-DATE
|
|
394
225
|
:testClasses
|
|
395
226
|
:test
|
|
396
227
|
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
HelloWorldTest > helloSampleName PASSED
|
|
400
|
-
|
|
401
|
-
HelloWorldTest > helloAnotherSampleName PASSED
|
|
228
|
+
GreeterTest > testThatGreeterReturnsTheCorrectGreeting PASSED
|
|
402
229
|
|
|
403
230
|
BUILD SUCCESSFUL
|
|
404
231
|
|
|
405
|
-
Total time:
|
|
232
|
+
Total time: 11.717 secs
|
|
406
233
|
```
|
|
407
234
|
|
|
408
|
-
|
|
409
|
-
"`Alice`" but "`Bob`" equally well. In this case, the test succeeded with
|
|
410
|
-
no additional code on our part.
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
## Refactoring
|
|
415
|
-
|
|
416
|
-
Now that you've got all the tests passing, you might consider whether
|
|
417
|
-
the code is in the most readable/maintainable/efficient shape. What makes
|
|
418
|
-
for "good" design of software is a big topic. The pursuit of it underlies
|
|
419
|
-
much of what makes up the more valuable conversations on Exercism.
|
|
420
|
-
|
|
421
|
-
For now, let's just take a quick review of our solution and see if there's
|
|
422
|
-
any part of it we'd like to refactor. Refactoring is changing the way
|
|
423
|
-
a bit of code reads without changing what it does.
|
|
424
|
-
|
|
425
|
-
Right now, the details of detecting whether the caller of `hello()` has
|
|
426
|
-
given a name or not (i.e. `name` is either `null` or an empty string) is
|
|
427
|
-
sitting right next to the core responsibility of the method: to produce a
|
|
428
|
-
personalized greeting.
|
|
429
|
-
|
|
430
|
-
```java
|
|
431
|
-
public class HelloWorld {
|
|
432
|
-
public static String hello(String name) {
|
|
433
|
-
if(name == null || "".equals(name)) {
|
|
434
|
-
name = "World";
|
|
435
|
-
}
|
|
436
|
-
return "Hello, " + name + "!";
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
```
|
|
440
|
-
|
|
441
|
-
How would things read if we extracted those details into a separate method
|
|
442
|
-
and at the same time, replaced the `if` with a ternary expression?
|
|
443
|
-
|
|
444
|
-
```java
|
|
445
|
-
public class HelloWorld {
|
|
446
|
-
|
|
447
|
-
public static String hello(String name) {
|
|
448
|
-
String whom = isBlank(name) ? "World" : name;
|
|
449
|
-
return "Hello, " + whom + "!";
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
private static boolean isBlank(String string) {
|
|
453
|
-
return string == null || "".equals(string);
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
```
|
|
457
|
-
|
|
458
|
-
By extracting that logic into the `isBlank()` method, we've added a little
|
|
459
|
-
abstraction to our program -- it's not as literal as it was before. Yet,
|
|
460
|
-
it allows us to defer *needing* to understand *how* "blankness" is
|
|
461
|
-
detected. If we can assume that `isBlank()` just works, we don't have to
|
|
462
|
-
downshift in our head to those details. Instead, we can remain at the same
|
|
463
|
-
level of thinking: to whom are we greeting?
|
|
464
|
-
|
|
465
|
-
The ternary operator allowed us to express that choice in a more compact
|
|
466
|
-
form. Less to read without losing the intent.
|
|
467
|
-
|
|
468
|
-
Finally, we introduced another variable: `whom`. Doing so gives a name to
|
|
469
|
-
the output of the ternary expression. We certainly could have continued
|
|
470
|
-
to reuse `name`, but by introducing a second `String` to hold the
|
|
471
|
-
calculated value this keeps crisp the two ideas: `name` is what's given
|
|
472
|
-
and `whom` is what's been determined.
|
|
473
|
-
|
|
474
|
-
We made a bunch of changes, let's make sure we didn't break the program!
|
|
475
|
-
|
|
476
|
-
```
|
|
477
|
-
$ gradle test
|
|
478
|
-
...
|
|
479
|
-
HelloWorldTest > helloNoName PASSED
|
|
480
|
-
|
|
481
|
-
HelloWorldTest > helloSampleName PASSED
|
|
482
|
-
|
|
483
|
-
HelloWorldTest > helloAnotherSampleName PASSED
|
|
484
|
-
...
|
|
485
|
-
```
|
|
486
|
-
|
|
487
|
-
This illustrates another benefit of writing tests: you can make significant
|
|
488
|
-
changes to the structure of the program and very quickly restore your
|
|
489
|
-
confidence that the program still works. These tests are a far cry from a
|
|
490
|
-
"proof" of correctness, but well-written tests do a much better job of
|
|
491
|
-
(very quickly) giving us evidence that it is. Without them, we manually
|
|
492
|
-
run the program with different inputs and/or inspecting the code
|
|
493
|
-
line-by-line -- time-consuming and error prone.
|
|
494
|
-
|
|
495
|
-
|
|
235
|
+
Success! Our solution passes the only test case supplied. We're good to go!
|
|
496
236
|
|
|
497
237
|
# Submitting your first iteration
|
|
498
238
|
|
|
@@ -500,15 +240,20 @@ With a working solution that we've reviewed, we're ready to submit it to
|
|
|
500
240
|
exercism.io.
|
|
501
241
|
|
|
502
242
|
```
|
|
503
|
-
$ exercism submit src/main/java/
|
|
243
|
+
$ exercism submit src/main/java/Greeter.java
|
|
504
244
|
```
|
|
505
245
|
|
|
506
|
-
|
|
507
|
-
|
|
508
246
|
# Next Steps
|
|
509
247
|
|
|
510
248
|
From here, there are a number of paths you can take.
|
|
511
249
|
|
|
250
|
+
Regardless of what you decide to do next, we sincerely hope you learn
|
|
251
|
+
and enjoy being part of this community. If at any time you need assistance
|
|
252
|
+
do not hesitate to ask for help:
|
|
253
|
+
|
|
254
|
+
http://exercism.io/languages/java/help
|
|
255
|
+
|
|
256
|
+
Cheers!
|
|
512
257
|
|
|
513
258
|
## Move on to the next exercise
|
|
514
259
|
|
|
@@ -518,7 +263,6 @@ There are many more exercises you can practice with. Grab the next one!
|
|
|
518
263
|
$ exercism fetch java
|
|
519
264
|
```
|
|
520
265
|
|
|
521
|
-
|
|
522
266
|
## Review (and comment on) others' submissions to this exercise
|
|
523
267
|
|
|
524
268
|
The heart of Exercism are the conversations about coding
|
|
@@ -538,39 +282,11 @@ Here's an up-to-date list of submissions on the Java track:
|
|
|
538
282
|
|
|
539
283
|
http://exercism.io/tracks/java/exercises
|
|
540
284
|
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
## Submit another iteration
|
|
544
|
-
|
|
545
|
-
You are also encouraged to consider additional "requirements" on a given
|
|
546
|
-
exercise.
|
|
547
|
-
|
|
548
|
-
For example, you could add a test or two that requires that the greeting
|
|
549
|
-
use the capitalized form on the person's name, regardless of the case they
|
|
550
|
-
used.
|
|
551
|
-
|
|
552
|
-
In that situation, you'd write a test to set-up that new expectation and
|
|
553
|
-
then implement that in the code (the same process we just went through
|
|
554
|
-
together, above).
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
285
|
## Contribute to Exercism
|
|
559
286
|
|
|
560
|
-
The entire of Exercism is Open Source and is
|
|
287
|
+
The entire of Exercism is Open Source and is a labor of love for over
|
|
561
288
|
100 maintainers and many more contributors.
|
|
562
289
|
|
|
563
290
|
A starting point to jumping in can be found here:
|
|
564
291
|
|
|
565
|
-
https://github.com/exercism/
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
----
|
|
569
|
-
|
|
570
|
-
Regardless of what you decide to do next, we sincerely hope you learn
|
|
571
|
-
and enjoy being part of this community. If at any time you need assistance
|
|
572
|
-
do not hesitate to ask for help:
|
|
573
|
-
|
|
574
|
-
http://exercism.io/languages/java/help
|
|
575
|
-
|
|
576
|
-
Cheers!
|
|
292
|
+
https://github.com/exercism/docs/tree/master/contributing-to-language-tracks
|