trackler 2.2.1.64 → 2.2.1.65
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/problem-specifications/exercises/all-your-base/canonical-data.json +7 -7
- data/tracks/c/config.json +1 -1
- data/tracks/csharp/config.json +10 -0
- data/tracks/csharp/docs/GENERATORS.md +3 -3
- data/tracks/csharp/exercises/Exercises.sln +8 -2
- data/tracks/csharp/exercises/accumulate/Accumulate.csproj +3 -3
- data/tracks/csharp/exercises/acronym/Acronym.csproj +3 -3
- data/tracks/csharp/exercises/all-your-base/AllYourBase.csproj +3 -3
- data/tracks/csharp/exercises/allergies/Allergies.csproj +3 -3
- data/tracks/csharp/exercises/alphametics/Alphametics.csproj +3 -3
- data/tracks/csharp/exercises/anagram/Anagram.csproj +3 -3
- data/tracks/csharp/exercises/atbash-cipher/AtbashCipher.csproj +3 -3
- data/tracks/csharp/exercises/bank-account/BankAccount.csproj +3 -3
- data/tracks/csharp/exercises/beer-song/BeerSong.csproj +3 -3
- data/tracks/csharp/exercises/binary-search-tree/BinarySearchTree.csproj +3 -3
- data/tracks/csharp/exercises/binary-search/BinarySearch.csproj +3 -3
- data/tracks/csharp/exercises/bob/Bob.csproj +3 -3
- data/tracks/csharp/exercises/book-store/BookStore.csproj +3 -3
- data/tracks/csharp/exercises/bowling/Bowling.csproj +3 -3
- data/tracks/csharp/exercises/bracket-push/BracketPush.csproj +3 -3
- data/tracks/csharp/exercises/change/Change.csproj +3 -3
- data/tracks/csharp/exercises/circular-buffer/CircularBuffer.csproj +3 -3
- data/tracks/csharp/exercises/clock/Clock.csproj +3 -3
- data/tracks/csharp/exercises/collatz-conjecture/CollatzConjecture.csproj +3 -3
- data/tracks/csharp/exercises/complex-numbers/ComplexNumbers.csproj +3 -3
- data/tracks/csharp/exercises/connect/Connect.csproj +3 -3
- data/tracks/csharp/exercises/crypto-square/CryptoSquare.csproj +3 -3
- data/tracks/csharp/exercises/custom-set/CustomSet.csproj +3 -3
- data/tracks/csharp/exercises/diamond/Diamond.csproj +3 -3
- data/tracks/csharp/exercises/difference-of-squares/DifferenceOfSquares.csproj +3 -3
- data/tracks/csharp/exercises/diffie-hellman/DiffieHellman.csproj +3 -3
- data/tracks/csharp/exercises/dominoes/Dominoes.csproj +3 -3
- data/tracks/csharp/exercises/dot-dsl/DotDsl.csproj +3 -3
- data/tracks/csharp/exercises/error-handling/ErrorHandling.csproj +3 -3
- data/tracks/csharp/exercises/etl/Etl.csproj +3 -3
- data/tracks/csharp/exercises/flatten-array/FlattenArray.csproj +3 -3
- data/tracks/csharp/exercises/food-chain/FoodChain.csproj +3 -3
- data/tracks/csharp/exercises/forth/Forth.csproj +3 -3
- data/tracks/csharp/exercises/gigasecond/Gigasecond.csproj +3 -3
- data/tracks/csharp/exercises/go-counting/GoCounting.csproj +3 -3
- data/tracks/csharp/exercises/grade-school/GradeSchool.csproj +3 -3
- data/tracks/csharp/exercises/grains/Grains.csproj +3 -3
- data/tracks/csharp/exercises/grep/Grep.csproj +3 -3
- data/tracks/csharp/exercises/hamming/Hamming.csproj +3 -3
- data/tracks/csharp/exercises/hangman/Hangman.csproj +3 -3
- data/tracks/csharp/exercises/hello-world/HelloWorld.csproj +3 -3
- data/tracks/csharp/exercises/house/House.csproj +3 -3
- data/tracks/csharp/exercises/isbn-verifier/IsbnVerifier.csproj +1 -1
- data/tracks/csharp/exercises/isogram/Isogram.csproj +3 -3
- data/tracks/csharp/exercises/kindergarten-garden/KindergartenGarden.csproj +3 -3
- data/tracks/csharp/exercises/largest-series-product/LargestSeriesProduct.csproj +3 -3
- data/tracks/csharp/exercises/leap/Leap.csproj +3 -3
- data/tracks/csharp/exercises/ledger/Ledger.csproj +3 -3
- data/tracks/csharp/exercises/linked-list/LinkedList.csproj +3 -3
- data/tracks/csharp/exercises/list-ops/ListOps.csproj +3 -3
- data/tracks/csharp/exercises/luhn/Luhn.csproj +3 -3
- data/tracks/csharp/exercises/markdown/Markdown.csproj +3 -3
- data/tracks/csharp/exercises/matrix/Matrix.csproj +3 -3
- data/tracks/csharp/exercises/meetup/Meetup.csproj +3 -3
- data/tracks/csharp/exercises/minesweeper/Minesweeper.csproj +3 -3
- data/tracks/csharp/exercises/nth-prime/NthPrime.csproj +3 -3
- data/tracks/csharp/exercises/nucleotide-count/NucleotideCount.csproj +3 -3
- data/tracks/csharp/exercises/ocr-numbers/OcrNumbers.csproj +3 -3
- data/tracks/csharp/exercises/palindrome-products/PalindromeProducts.csproj +3 -3
- data/tracks/csharp/exercises/pangram/Pangram.csproj +3 -3
- data/tracks/csharp/exercises/parallel-letter-frequency/ParallelLetterFrequency.csproj +3 -3
- data/tracks/csharp/exercises/pascals-triangle/PascalsTriangle.csproj +3 -3
- data/tracks/csharp/exercises/perfect-numbers/PerfectNumbers.csproj +3 -3
- data/tracks/csharp/exercises/phone-number/PhoneNumber.csproj +3 -3
- data/tracks/csharp/exercises/pig-latin/PigLatin.csproj +3 -3
- data/tracks/csharp/exercises/poker/Poker.csproj +3 -3
- data/tracks/csharp/exercises/pov/Pov.csproj +3 -3
- data/tracks/csharp/exercises/prime-factors/PrimeFactors.csproj +3 -3
- data/tracks/csharp/exercises/protein-translation/ProteinTranslation.csproj +3 -3
- data/tracks/csharp/exercises/proverb/Proverb.csproj +3 -3
- data/tracks/csharp/exercises/pythagorean-triplet/PythagoreanTriplet.csproj +3 -3
- data/tracks/csharp/exercises/queen-attack/QueenAttack.csproj +3 -3
- data/tracks/csharp/exercises/rail-fence-cipher/RailFenceCipher.csproj +3 -3
- data/tracks/csharp/exercises/raindrops/Raindrops.csproj +3 -3
- data/tracks/csharp/exercises/react/React.csproj +3 -3
- data/tracks/csharp/exercises/rectangles/Rectangles.csproj +3 -3
- data/tracks/csharp/exercises/reverse-string/Example.cs +10 -0
- data/tracks/csharp/exercises/reverse-string/README.md +3 -0
- data/tracks/csharp/exercises/reverse-string/ReverseString.cs +9 -0
- data/tracks/csharp/exercises/reverse-string/ReverseString.csproj +17 -0
- data/tracks/csharp/exercises/reverse-string/ReverseStringTest.cs +36 -0
- data/tracks/csharp/exercises/rna-transcription/RnaTranscription.csproj +3 -3
- data/tracks/csharp/exercises/robot-name/RobotName.csproj +3 -3
- data/tracks/csharp/exercises/robot-simulator/RobotSimulator.csproj +3 -3
- data/tracks/csharp/exercises/roman-numerals/RomanNumerals.csproj +3 -3
- data/tracks/csharp/exercises/rotational-cipher/RotationalCipher.csproj +3 -3
- data/tracks/csharp/exercises/run-length-encoding/RunLengthEncoding.csproj +3 -3
- data/tracks/csharp/exercises/saddle-points/SaddlePoints.csproj +3 -3
- data/tracks/csharp/exercises/say/Say.csproj +3 -3
- data/tracks/csharp/exercises/scale-generator/ScaleGenerator.csproj +3 -3
- data/tracks/csharp/exercises/scrabble-score/ScrabbleScore.csproj +3 -3
- data/tracks/csharp/exercises/secret-handshake/SecretHandshake.csproj +3 -3
- data/tracks/csharp/exercises/series/Series.csproj +3 -3
- data/tracks/csharp/exercises/sgf-parsing/SgfParsing.csproj +3 -3
- data/tracks/csharp/exercises/sieve/Sieve.csproj +3 -3
- data/tracks/csharp/exercises/simple-cipher/SimpleCipher.csproj +3 -3
- data/tracks/csharp/exercises/simple-linked-list/SimpleLinkedList.csproj +3 -3
- data/tracks/csharp/exercises/space-age/SpaceAge.csproj +3 -3
- data/tracks/csharp/exercises/spiral-matrix/SpiralMatrix.csproj +3 -3
- data/tracks/csharp/exercises/strain/Strain.csproj +3 -3
- data/tracks/csharp/exercises/sublist/Sublist.csproj +3 -3
- data/tracks/csharp/exercises/sum-of-multiples/SumOfMultiples.csproj +3 -3
- data/tracks/csharp/exercises/tournament/Tournament.csproj +3 -3
- data/tracks/csharp/exercises/transpose/Transpose.csproj +3 -3
- data/tracks/csharp/exercises/tree-building/TreeBuilding.csproj +3 -3
- data/tracks/csharp/exercises/triangle/Triangle.csproj +3 -3
- data/tracks/csharp/exercises/twelve-days/TwelveDays.csproj +3 -3
- data/tracks/csharp/exercises/two-bucket/TwoBucket.csproj +3 -3
- data/tracks/csharp/exercises/two-fer/TwoFer.csproj +3 -3
- data/tracks/csharp/exercises/variable-length-quantity/VariableLengthQuantity.csproj +3 -3
- data/tracks/csharp/exercises/word-count/WordCount.csproj +3 -3
- data/tracks/csharp/exercises/word-search/WordSearch.csproj +3 -3
- data/tracks/csharp/exercises/wordy/Wordy.csproj +3 -3
- data/tracks/csharp/exercises/zebra-puzzle/ZebraPuzzle.csproj +3 -3
- data/tracks/csharp/exercises/zipper/Zipper.csproj +3 -3
- data/tracks/csharp/generators/CustomExercise.cs +9 -0
- data/tracks/csharp/generators/Exercise.cs +3 -110
- data/tracks/csharp/generators/ExerciseCollection.cs +33 -14
- data/tracks/csharp/generators/Exercises/Acronym.cs +1 -1
- data/tracks/csharp/generators/Exercises/AllYourBase.cs +1 -1
- data/tracks/csharp/generators/Exercises/Allergies.cs +1 -1
- data/tracks/csharp/generators/Exercises/Alphametics.cs +1 -1
- data/tracks/csharp/generators/Exercises/Anagram.cs +1 -1
- data/tracks/csharp/generators/Exercises/AtbashCipher.cs +1 -1
- data/tracks/csharp/generators/Exercises/BeerSong.cs +1 -1
- data/tracks/csharp/generators/Exercises/BinarySearch.cs +1 -1
- data/tracks/csharp/generators/Exercises/Bob.cs +1 -1
- data/tracks/csharp/generators/Exercises/BookStore.cs +1 -1
- data/tracks/csharp/generators/Exercises/Bowling.cs +1 -2
- data/tracks/csharp/generators/Exercises/BracketPush.cs +1 -1
- data/tracks/csharp/generators/Exercises/Clock.cs +1 -1
- data/tracks/csharp/generators/Exercises/CollatzConjecture.cs +1 -1
- data/tracks/csharp/generators/Exercises/ComplexNumbers.cs +1 -1
- data/tracks/csharp/generators/Exercises/Connect.cs +2 -4
- data/tracks/csharp/generators/Exercises/CryptoSquare.cs +1 -1
- data/tracks/csharp/generators/Exercises/Diamond.cs +9 -0
- data/tracks/csharp/generators/Exercises/DifferenceOfSquares.cs +1 -2
- data/tracks/csharp/generators/Exercises/Dominoes.cs +1 -1
- data/tracks/csharp/generators/Exercises/Etl.cs +1 -1
- data/tracks/csharp/generators/Exercises/FlattenArray.cs +1 -2
- data/tracks/csharp/generators/Exercises/FoodChain.cs +1 -1
- data/tracks/csharp/generators/Exercises/Gigasecond.cs +1 -1
- data/tracks/csharp/generators/Exercises/Grains.cs +1 -1
- data/tracks/csharp/generators/Exercises/Hamming.cs +1 -1
- data/tracks/csharp/generators/Exercises/HelloWorld.cs +1 -1
- data/tracks/csharp/generators/Exercises/House.cs +1 -1
- data/tracks/csharp/generators/Exercises/IsbnVerifier.cs +2 -4
- data/tracks/csharp/generators/Exercises/Isogram.cs +1 -1
- data/tracks/csharp/generators/Exercises/KindergartenGarden.cs +1 -1
- data/tracks/csharp/generators/Exercises/LargestSeriesProduct.cs +1 -1
- data/tracks/csharp/generators/Exercises/Leap.cs +1 -1
- data/tracks/csharp/generators/Exercises/Luhn.cs +1 -1
- data/tracks/csharp/generators/Exercises/Meetup.cs +1 -1
- data/tracks/csharp/generators/Exercises/Minesweeper.cs +1 -1
- data/tracks/csharp/generators/Exercises/NthPrime.cs +1 -1
- data/tracks/csharp/generators/Exercises/NucleotideCount.cs +1 -1
- data/tracks/csharp/generators/Exercises/OcrNumbers.cs +1 -1
- data/tracks/csharp/generators/Exercises/Pangram.cs +1 -1
- data/tracks/csharp/generators/Exercises/PascalsTriangle.cs +1 -1
- data/tracks/csharp/generators/Exercises/PerfectNumbers.cs +1 -1
- data/tracks/csharp/generators/Exercises/PhoneNumber.cs +1 -1
- data/tracks/csharp/generators/Exercises/PigLatin.cs +1 -1
- data/tracks/csharp/generators/Exercises/Poker.cs +1 -1
- data/tracks/csharp/generators/Exercises/PrimeFactors.cs +1 -1
- data/tracks/csharp/generators/Exercises/QueenAttack.cs +1 -1
- data/tracks/csharp/generators/Exercises/RailFenceCipher.cs +1 -1
- data/tracks/csharp/generators/Exercises/Raindrops.cs +1 -1
- data/tracks/csharp/generators/Exercises/ReverseString.cs +6 -0
- data/tracks/csharp/generators/Exercises/RnaTranscription.cs +1 -1
- data/tracks/csharp/generators/Exercises/RomanNumerals.cs +1 -1
- data/tracks/csharp/generators/Exercises/RotationalCipher.cs +1 -1
- data/tracks/csharp/generators/Exercises/RunLengthEncoding.cs +1 -1
- data/tracks/csharp/generators/Exercises/SaddlePoints.cs +1 -1
- data/tracks/csharp/generators/Exercises/Say.cs +1 -1
- data/tracks/csharp/generators/Exercises/ScrabbleScore.cs +1 -1
- data/tracks/csharp/generators/Exercises/SecretHandshake.cs +1 -1
- data/tracks/csharp/generators/Exercises/Sieve.cs +1 -1
- data/tracks/csharp/generators/Exercises/SpaceAge.cs +1 -1
- data/tracks/csharp/generators/Exercises/SumOfMultiples.cs +1 -1
- data/tracks/csharp/generators/Exercises/Tournament.cs +1 -1
- data/tracks/csharp/generators/Exercises/Transpose.cs +1 -1
- data/tracks/csharp/generators/Exercises/Triangle.cs +1 -2
- data/tracks/csharp/generators/Exercises/TwoBucket.cs +1 -1
- data/tracks/csharp/generators/Exercises/TwoFer.cs +1 -1
- data/tracks/csharp/generators/Exercises/WordCount.cs +1 -1
- data/tracks/csharp/generators/Exercises/Wordy.cs +1 -1
- data/tracks/csharp/generators/GeneratorExercise.cs +114 -0
- data/tracks/csharp/generators/GeneratorStatus.cs +11 -0
- data/tracks/csharp/generators/Generators.csproj +1 -1
- data/tracks/csharp/generators/Input/CanonicalDataFile.cs +11 -9
- data/tracks/csharp/generators/Input/CanonicalDataParser.cs +5 -6
- data/tracks/csharp/generators/Input/ConfigFile.cs +29 -0
- data/tracks/csharp/generators/MissingDataExercise.cs +9 -0
- data/tracks/csharp/generators/Options.cs +18 -5
- data/tracks/csharp/generators/Output/ExerciseWriter.cs +5 -8
- data/tracks/csharp/generators/Output/NameExtensions.cs +3 -1
- data/tracks/csharp/generators/Program.cs +54 -15
- data/tracks/csharp/generators/UnimplementedExercise.cs +9 -0
- data/tracks/dart/README.md +6 -0
- data/tracks/dart/config.json +1 -1
- data/tracks/fsharp/config.json +24 -0
- data/tracks/fsharp/exercises/Exercises.sln +12 -0
- data/tracks/fsharp/exercises/accumulate/Accumulate.fsproj +4 -4
- data/tracks/fsharp/exercises/acronym/Acronym.fsproj +4 -4
- data/tracks/fsharp/exercises/all-your-base/AllYourBase.fsproj +4 -4
- data/tracks/fsharp/exercises/all-your-base/AllYourBaseTest.fs +5 -5
- data/tracks/fsharp/exercises/all-your-base/Example.fs +9 -7
- data/tracks/fsharp/exercises/allergies/Allergies.fsproj +4 -4
- data/tracks/fsharp/exercises/alphametics/Alphametics.fsproj +4 -4
- data/tracks/fsharp/exercises/alphametics/AlphameticsTest.fs +32 -32
- data/tracks/fsharp/exercises/anagram/Anagram.fsproj +4 -4
- data/tracks/fsharp/exercises/atbash-cipher/AtbashCipher.fsproj +4 -4
- data/tracks/fsharp/exercises/bank-account/BankAccount.fsproj +4 -4
- data/tracks/fsharp/exercises/beer-song/BeerSong.fsproj +4 -4
- data/tracks/fsharp/exercises/binary-search-tree/BinarySearchTree.fsproj +4 -4
- data/tracks/fsharp/exercises/binary-search/BinarySearch.fsproj +4 -4
- data/tracks/fsharp/exercises/bob/Bob.fsproj +4 -4
- data/tracks/fsharp/exercises/book-store/BookStore.fsproj +4 -4
- data/tracks/fsharp/exercises/bowling/Bowling.fsproj +4 -4
- data/tracks/fsharp/exercises/bracket-push/BracketPush.fsproj +4 -4
- data/tracks/fsharp/exercises/change/Change.fsproj +4 -4
- data/tracks/fsharp/exercises/circular-buffer/CircularBuffer.fsproj +4 -4
- data/tracks/fsharp/exercises/clock/Clock.fsproj +4 -4
- data/tracks/fsharp/exercises/collatz-conjecture/CollatzConjecture.fs +3 -0
- data/tracks/fsharp/exercises/collatz-conjecture/CollatzConjecture.fsproj +23 -0
- data/tracks/fsharp/exercises/collatz-conjecture/CollatzConjectureTest.fs +33 -0
- data/tracks/fsharp/exercises/collatz-conjecture/Example.fs +15 -0
- data/tracks/fsharp/exercises/collatz-conjecture/Program.fs +1 -0
- data/tracks/fsharp/exercises/collatz-conjecture/README.md +32 -0
- data/tracks/fsharp/exercises/connect/Connect.fsproj +4 -4
- data/tracks/fsharp/exercises/connect/ConnectTest.fs +35 -35
- data/tracks/fsharp/exercises/crypto-square/CryptoSquare.fsproj +4 -4
- data/tracks/fsharp/exercises/custom-set/CustomSet.fsproj +4 -4
- data/tracks/fsharp/exercises/diamond/Diamond.fsproj +4 -4
- data/tracks/fsharp/exercises/difference-of-squares/DifferenceOfSquares.fsproj +4 -4
- data/tracks/fsharp/exercises/diffie-hellman/DiffieHellman.fsproj +4 -4
- data/tracks/fsharp/exercises/dominoes/Dominoes.fsproj +4 -4
- data/tracks/fsharp/exercises/dot-dsl/DotDsl.fsproj +4 -4
- data/tracks/fsharp/exercises/error-handling/ErrorHandling.fsproj +4 -4
- data/tracks/fsharp/exercises/etl/Etl.fsproj +4 -4
- data/tracks/fsharp/exercises/etl/EtlTest.fs +39 -39
- data/tracks/fsharp/exercises/food-chain/FoodChain.fsproj +4 -4
- data/tracks/fsharp/exercises/forth/Forth.fsproj +4 -4
- data/tracks/fsharp/exercises/gigasecond/Gigasecond.fsproj +4 -4
- data/tracks/fsharp/exercises/go-counting/GoCounting.fsproj +4 -4
- data/tracks/fsharp/exercises/grade-school/GradeSchool.fsproj +4 -4
- data/tracks/fsharp/exercises/grains/Grains.fsproj +4 -4
- data/tracks/fsharp/exercises/grep/Grep.fsproj +4 -4
- data/tracks/fsharp/exercises/hamming/Hamming.fsproj +4 -4
- data/tracks/fsharp/exercises/hangman/Hangman.fsproj +4 -4
- data/tracks/fsharp/exercises/hello-world/HelloWorld.fsproj +4 -4
- data/tracks/fsharp/exercises/house/House.fsproj +4 -4
- data/tracks/fsharp/exercises/isogram/Isogram.fsproj +4 -4
- data/tracks/fsharp/exercises/kindergarten-garden/KindergartenGarden.fsproj +4 -4
- data/tracks/fsharp/exercises/largest-series-product/LargestSeriesProduct.fsproj +4 -4
- data/tracks/fsharp/exercises/leap/Leap.fsproj +4 -4
- data/tracks/fsharp/exercises/ledger/Ledger.fsproj +4 -4
- data/tracks/fsharp/exercises/lens-person/LensPerson.fsproj +4 -4
- data/tracks/fsharp/exercises/linked-list/LinkedList.fsproj +4 -4
- data/tracks/fsharp/exercises/list-ops/ListOps.fsproj +4 -4
- data/tracks/fsharp/exercises/luhn/Luhn.fsproj +4 -4
- data/tracks/fsharp/exercises/markdown/Markdown.fsproj +4 -4
- data/tracks/fsharp/exercises/matrix/Matrix.fsproj +4 -4
- data/tracks/fsharp/exercises/meetup/Meetup.fsproj +4 -4
- data/tracks/fsharp/exercises/minesweeper/Minesweeper.fsproj +4 -4
- data/tracks/fsharp/exercises/minesweeper/MinesweeperTest.fs +50 -50
- data/tracks/fsharp/exercises/nth-prime/NthPrime.fsproj +4 -4
- data/tracks/fsharp/exercises/nucleotide-count/NucleotideCount.fsproj +4 -4
- data/tracks/fsharp/exercises/nucleotide-count/NucleotideCountTest.fs +12 -12
- data/tracks/fsharp/exercises/ocr-numbers/OcrNumbers.fsproj +4 -4
- data/tracks/fsharp/exercises/ocr-numbers/OcrNumbersTest.fs +58 -58
- data/tracks/fsharp/exercises/palindrome-products/PalindromeProducts.fsproj +4 -4
- data/tracks/fsharp/exercises/pangram/Pangram.fsproj +4 -4
- data/tracks/fsharp/exercises/parallel-letter-frequency/ParallelLetterFrequency.fsproj +4 -4
- data/tracks/fsharp/exercises/pascals-triangle/PascalsTriangle.fsproj +4 -4
- data/tracks/fsharp/exercises/pascals-triangle/PascalsTriangleTest.fs +64 -7
- data/tracks/fsharp/exercises/perfect-numbers/PerfectNumbers.fsproj +4 -4
- data/tracks/fsharp/exercises/phone-number/PhoneNumber.fsproj +4 -4
- data/tracks/fsharp/exercises/pig-latin/PigLatin.fsproj +4 -4
- data/tracks/fsharp/exercises/poker/Poker.fsproj +4 -4
- data/tracks/fsharp/exercises/pov/Pov.fsproj +4 -4
- data/tracks/fsharp/exercises/prime-factors/PrimeFactors.fsproj +4 -4
- data/tracks/fsharp/exercises/protein-translation/ProteinTranslation.fsproj +4 -4
- data/tracks/fsharp/exercises/proverb/Proverb.fsproj +4 -4
- data/tracks/fsharp/exercises/pythagorean-triplet/PythagoreanTriplet.fsproj +4 -4
- data/tracks/fsharp/exercises/queen-attack/QueenAttack.fsproj +4 -4
- data/tracks/fsharp/exercises/rail-fence-cipher/RailFenceCipher.fsproj +4 -4
- data/tracks/fsharp/exercises/raindrops/Raindrops.fsproj +4 -4
- data/tracks/fsharp/exercises/react/React.fsproj +4 -4
- data/tracks/fsharp/exercises/rectangles/Rectangles.fsproj +4 -4
- data/tracks/fsharp/exercises/reverse-string/Example.fs +5 -0
- data/tracks/fsharp/exercises/reverse-string/Program.fs +1 -0
- data/tracks/fsharp/exercises/reverse-string/README.md +3 -0
- data/tracks/fsharp/exercises/reverse-string/ReverseString.fs +3 -0
- data/tracks/fsharp/exercises/reverse-string/ReverseString.fsproj +23 -0
- data/tracks/fsharp/exercises/reverse-string/ReverseStringTest.fs +29 -0
- data/tracks/fsharp/exercises/rna-transcription/RnaTranscription.fsproj +4 -4
- data/tracks/fsharp/exercises/robot-name/RobotName.fsproj +4 -4
- data/tracks/fsharp/exercises/robot-simulator/RobotSimulator.fsproj +4 -4
- data/tracks/fsharp/exercises/roman-numerals/RomanNumerals.fsproj +4 -4
- data/tracks/fsharp/exercises/run-length-encoding/RunLengthEncoding.fsproj +4 -4
- data/tracks/fsharp/exercises/saddle-points/SaddlePoints.fsproj +4 -4
- data/tracks/fsharp/exercises/say/Say.fsproj +4 -4
- data/tracks/fsharp/exercises/scale-generator/ScaleGenerator.fsproj +4 -4
- data/tracks/fsharp/exercises/scrabble-score/ScrabbleScore.fsproj +4 -4
- data/tracks/fsharp/exercises/secret-handshake/SecretHandshake.fsproj +4 -4
- data/tracks/fsharp/exercises/series/Series.fsproj +4 -4
- data/tracks/fsharp/exercises/sgf-parsing/SgfParsing.fsproj +4 -4
- data/tracks/fsharp/exercises/sieve/Sieve.fsproj +4 -4
- data/tracks/fsharp/exercises/simple-cipher/SimpleCipher.fsproj +4 -4
- data/tracks/fsharp/exercises/simple-linked-list/SimpleLinkedList.fsproj +4 -4
- data/tracks/fsharp/exercises/space-age/SpaceAge.fsproj +4 -4
- data/tracks/fsharp/exercises/strain/Strain.fsproj +4 -4
- data/tracks/fsharp/exercises/sublist/Sublist.fsproj +4 -4
- data/tracks/fsharp/exercises/sum-of-multiples/SumOfMultiples.fsproj +4 -4
- data/tracks/fsharp/exercises/tournament/Tournament.fsproj +4 -4
- data/tracks/fsharp/exercises/transpose/Transpose.fsproj +4 -4
- data/tracks/fsharp/exercises/tree-building/TreeBuilding.fsproj +4 -4
- data/tracks/fsharp/exercises/triangle/Triangle.fsproj +4 -4
- data/tracks/fsharp/exercises/twelve-days/TwelveDays.fsproj +4 -4
- data/tracks/fsharp/exercises/two-bucket/TwoBucket.fsproj +4 -4
- data/tracks/fsharp/exercises/two-fer/TwoFer.fsproj +4 -4
- data/tracks/fsharp/exercises/variable-length-quantity/VariableLengthQuantity.fsproj +4 -4
- data/tracks/fsharp/exercises/word-count/WordCount.fsproj +4 -4
- data/tracks/fsharp/exercises/word-search/WordSearch.fsproj +4 -4
- data/tracks/fsharp/exercises/wordy/Wordy.fsproj +4 -4
- data/tracks/fsharp/exercises/zebra-puzzle/ZebraPuzzle.fsproj +4 -4
- data/tracks/fsharp/exercises/zipper/Zipper.fsproj +4 -4
- data/tracks/fsharp/generators/Common.fs +4 -1
- data/tracks/fsharp/generators/Generators.fs +29 -6
- data/tracks/fsharp/generators/Generators.fsproj +1 -1
- data/tracks/go/exercises/book-store/.meta/gen.go +54 -0
- data/tracks/go/exercises/book-store/book_store_test.go +0 -67
- data/tracks/go/exercises/book-store/cases_test.go +77 -0
- data/tracks/go/exercises/forth/cases_test.go +41 -6
- data/tracks/go/exercises/hamming/.meta/gen.go +16 -6
- data/tracks/go/exercises/hamming/cases_test.go +7 -7
- data/tracks/go/exercises/isbn-verifier/.meta/gen.go +44 -0
- data/tracks/go/exercises/isbn-verifier/cases_test.go +25 -0
- data/tracks/go/exercises/isbn-verifier/example.go +2 -2
- data/tracks/go/exercises/isbn-verifier/isbn_verifier_test.go +3 -22
- data/tracks/go/exercises/perfect-numbers/.meta/gen.go +88 -0
- data/tracks/go/exercises/perfect-numbers/.meta/hints.md +19 -0
- data/tracks/go/exercises/perfect-numbers/README.md +23 -2
- data/tracks/go/exercises/perfect-numbers/cases_test.go +89 -0
- data/tracks/go/exercises/perfect-numbers/example.go +4 -4
- data/tracks/go/exercises/perfect-numbers/perfect_numbers_test.go +13 -18
- data/tracks/go/exercises/wordy/.meta/gen.go +76 -0
- data/tracks/go/exercises/wordy/cases_test.go +111 -0
- data/tracks/go/exercises/wordy/wordy_test.go +7 -29
- data/tracks/groovy/config.json +4 -4
- data/tracks/haskell/exercises/all-your-base/package.yaml +1 -1
- data/tracks/haskell/exercises/all-your-base/test/Tests.hs +2 -2
- data/tracks/haskell/exercises/beer-song/README.md +1 -1
- data/tracks/haskell/exercises/forth/package.yaml +1 -1
- data/tracks/haskell/exercises/forth/test/Tests.hs +21 -3
- data/tracks/haskell/exercises/isbn-verifier/package.yaml +1 -1
- data/tracks/haskell/exercises/meetup/README.md +16 -12
- data/tracks/haskell/exercises/sum-of-multiples/README.md +3 -3
- data/tracks/javascript/exercises/bowling/README.md +6 -6
- data/tracks/javascript/exercises/bowling/bowling.spec.js +14 -14
- data/tracks/javascript/exercises/saddle-points/README.md +1 -1
- data/tracks/javascript/exercises/sum-of-multiples/README.md +1 -1
- data/tracks/javascript/exercises/two-bucket/two-bucket.spec.js +2 -2
- data/tracks/julia/config.json +6 -6
- data/tracks/python/.gitignore +2 -0
- data/tracks/python/config.json +14 -0
- data/tracks/python/exercises/binary-search-tree/README.md +71 -0
- data/tracks/python/exercises/binary-search-tree/binary_search_tree.py +14 -0
- data/tracks/python/exercises/binary-search-tree/binary_search_tree_test.py +58 -0
- data/tracks/python/exercises/binary-search-tree/example.py +61 -0
- data/tracks/python/exercises/go-counting/go_counting_test.py +23 -23
- data/tracks/python/exercises/minesweeper/example.py +10 -14
- data/tracks/python/exercises/minesweeper/minesweeper_test.py +108 -119
- data/tracks/rust/config.json +12 -0
- data/tracks/rust/exercises/beer-song/README.md +1 -1
- data/tracks/rust/exercises/proverb/README.md +5 -2
- data/tracks/rust/exercises/reverse-string/.gitignore +3 -0
- data/tracks/rust/exercises/reverse-string/Cargo.toml +6 -0
- data/tracks/rust/exercises/reverse-string/README.md +46 -0
- data/tracks/rust/exercises/reverse-string/example.rs +7 -0
- data/tracks/rust/exercises/reverse-string/src/lib.rs +3 -0
- data/tracks/rust/exercises/reverse-string/tests/reverse-string.rs +57 -0
- data/tracks/rust/exercises/sum-of-multiples/README.md +3 -3
- metadata +46 -3
- data/tracks/csharp/generators/Input/CanonicalDataOptions.cs +0 -8
@@ -21,7 +21,7 @@
|
|
21
21
|
|
22
22
|
<ItemGroup>
|
23
23
|
<PackageReference Include="CommandLineParser" Version="2.1.1-beta" />
|
24
|
-
<PackageReference Include="DotLiquid" Version="2.0.
|
24
|
+
<PackageReference Include="DotLiquid" Version="2.0.200" />
|
25
25
|
<PackageReference Include="Humanizer" Version="2.2.0" />
|
26
26
|
<PackageReference Include="LibGit2Sharp.Portable" Version="0.24.10" />
|
27
27
|
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" />
|
@@ -0,0 +1,54 @@
|
|
1
|
+
package main
|
2
|
+
|
3
|
+
import (
|
4
|
+
"log"
|
5
|
+
"text/template"
|
6
|
+
|
7
|
+
"../../../gen"
|
8
|
+
)
|
9
|
+
|
10
|
+
func main() {
|
11
|
+
t, err := template.New("").Parse(tmpl)
|
12
|
+
if err != nil {
|
13
|
+
log.Fatal(err)
|
14
|
+
}
|
15
|
+
var j js
|
16
|
+
if err := gen.Gen("book-store", &j, t); err != nil {
|
17
|
+
log.Fatal(err)
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
// The JSON structure we expect to be able to unmarshal into
|
22
|
+
type js struct {
|
23
|
+
Cases []OneCase
|
24
|
+
Groups []TestGroup `json:"cases"`
|
25
|
+
}
|
26
|
+
|
27
|
+
type TestGroup struct {
|
28
|
+
Description string
|
29
|
+
Cases []OneCase
|
30
|
+
}
|
31
|
+
|
32
|
+
type OneCase struct {
|
33
|
+
Description string
|
34
|
+
Basket []int
|
35
|
+
Expected float64
|
36
|
+
}
|
37
|
+
|
38
|
+
// template applied to above data structure generates the Go test cases
|
39
|
+
var tmpl = `package bookstore
|
40
|
+
|
41
|
+
{{.Header}}
|
42
|
+
|
43
|
+
var testCases = []struct {
|
44
|
+
description string
|
45
|
+
basket []int
|
46
|
+
expected float64
|
47
|
+
}{{range .J.Groups}}{
|
48
|
+
{{range .Cases}} {
|
49
|
+
description: "{{.Description}}",
|
50
|
+
basket: {{printf "%#v" .Basket}},
|
51
|
+
expected: {{printf "%.2f" .Expected}},
|
52
|
+
},
|
53
|
+
{{end}}}{{end}}
|
54
|
+
`
|
@@ -4,73 +4,6 @@ import (
|
|
4
4
|
"testing"
|
5
5
|
)
|
6
6
|
|
7
|
-
var testCases = []struct {
|
8
|
-
description string
|
9
|
-
basket []int
|
10
|
-
expected float64
|
11
|
-
}{
|
12
|
-
{
|
13
|
-
description: "only a single book",
|
14
|
-
basket: []int{1},
|
15
|
-
expected: 8.00,
|
16
|
-
},
|
17
|
-
{
|
18
|
-
description: "two of the same book",
|
19
|
-
basket: []int{2, 2},
|
20
|
-
expected: 16.00,
|
21
|
-
},
|
22
|
-
{
|
23
|
-
description: "empty basket",
|
24
|
-
basket: []int{},
|
25
|
-
expected: 0.00,
|
26
|
-
},
|
27
|
-
{
|
28
|
-
description: "two different books",
|
29
|
-
basket: []int{1, 2},
|
30
|
-
expected: 15.20,
|
31
|
-
},
|
32
|
-
{
|
33
|
-
description: "four different books",
|
34
|
-
basket: []int{1, 2, 3, 4},
|
35
|
-
expected: 25.60,
|
36
|
-
},
|
37
|
-
{
|
38
|
-
description: "five different books",
|
39
|
-
basket: []int{1, 2, 3, 4, 5},
|
40
|
-
expected: 30.00,
|
41
|
-
},
|
42
|
-
{
|
43
|
-
description: "two groups of four is cheaper than group of five plus group of three",
|
44
|
-
basket: []int{1, 1, 2, 2, 3, 3, 4, 5},
|
45
|
-
expected: 51.20,
|
46
|
-
},
|
47
|
-
{
|
48
|
-
description: "groups of four plus group of two is is cheaper than two groups of three",
|
49
|
-
basket: []int{1, 1, 2, 2, 3, 4},
|
50
|
-
expected: 40.80,
|
51
|
-
},
|
52
|
-
{
|
53
|
-
description: "two each of first 4 books and 1 copy of each of rest",
|
54
|
-
basket: []int{1, 1, 2, 2, 3, 3, 4, 4, 5},
|
55
|
-
expected: 55.60,
|
56
|
-
},
|
57
|
-
{
|
58
|
-
description: "two copies of each book",
|
59
|
-
basket: []int{1, 1, 2, 2, 3, 3, 4, 4, 5, 5},
|
60
|
-
expected: 60.00,
|
61
|
-
},
|
62
|
-
{
|
63
|
-
description: "three copies of first book and 2 each fo remaining",
|
64
|
-
basket: []int{1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1},
|
65
|
-
expected: 68.00,
|
66
|
-
},
|
67
|
-
{
|
68
|
-
description: "three each of first 2 books and 2 each of remaining books",
|
69
|
-
basket: []int{1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1, 2},
|
70
|
-
expected: 75.20,
|
71
|
-
},
|
72
|
-
}
|
73
|
-
|
74
7
|
func TestCost(t *testing.T) {
|
75
8
|
for _, testCase := range testCases {
|
76
9
|
cost := Cost(testCase.basket)
|
@@ -0,0 +1,77 @@
|
|
1
|
+
package bookstore
|
2
|
+
|
3
|
+
// Source: exercism/problem-specifications
|
4
|
+
// Commit: 087ad69 book-store: Add missing trailing zero
|
5
|
+
// Problem Specifications Version: 1.0.1
|
6
|
+
|
7
|
+
var testCases = []struct {
|
8
|
+
description string
|
9
|
+
basket []int
|
10
|
+
expected float64
|
11
|
+
}{
|
12
|
+
{
|
13
|
+
description: "Only a single book",
|
14
|
+
basket: []int{1},
|
15
|
+
expected: 8.00,
|
16
|
+
},
|
17
|
+
{
|
18
|
+
description: "Two of the same book",
|
19
|
+
basket: []int{2, 2},
|
20
|
+
expected: 16.00,
|
21
|
+
},
|
22
|
+
{
|
23
|
+
description: "Empty basket",
|
24
|
+
basket: []int{},
|
25
|
+
expected: 0.00,
|
26
|
+
},
|
27
|
+
{
|
28
|
+
description: "Two different books",
|
29
|
+
basket: []int{1, 2},
|
30
|
+
expected: 15.20,
|
31
|
+
},
|
32
|
+
{
|
33
|
+
description: "Three different books",
|
34
|
+
basket: []int{1, 2, 3},
|
35
|
+
expected: 21.60,
|
36
|
+
},
|
37
|
+
{
|
38
|
+
description: "Four different books",
|
39
|
+
basket: []int{1, 2, 3, 4},
|
40
|
+
expected: 25.60,
|
41
|
+
},
|
42
|
+
{
|
43
|
+
description: "Five different books",
|
44
|
+
basket: []int{1, 2, 3, 4, 5},
|
45
|
+
expected: 30.00,
|
46
|
+
},
|
47
|
+
{
|
48
|
+
description: "Two groups of four is cheaper than group of five plus group of three",
|
49
|
+
basket: []int{1, 1, 2, 2, 3, 3, 4, 5},
|
50
|
+
expected: 51.20,
|
51
|
+
},
|
52
|
+
{
|
53
|
+
description: "Group of four plus group of two is cheaper than two groups of three",
|
54
|
+
basket: []int{1, 1, 2, 2, 3, 4},
|
55
|
+
expected: 40.80,
|
56
|
+
},
|
57
|
+
{
|
58
|
+
description: "Two each of first 4 books and 1 copy each of rest",
|
59
|
+
basket: []int{1, 1, 2, 2, 3, 3, 4, 4, 5},
|
60
|
+
expected: 55.60,
|
61
|
+
},
|
62
|
+
{
|
63
|
+
description: "Two copies of each book",
|
64
|
+
basket: []int{1, 1, 2, 2, 3, 3, 4, 4, 5, 5},
|
65
|
+
expected: 60.00,
|
66
|
+
},
|
67
|
+
{
|
68
|
+
description: "Three copies of first book and 2 each of remaining",
|
69
|
+
basket: []int{1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1},
|
70
|
+
expected: 68.00,
|
71
|
+
},
|
72
|
+
{
|
73
|
+
description: "Three each of first 2 books and 2 each of remaining books",
|
74
|
+
basket: []int{1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1, 2},
|
75
|
+
expected: 75.20,
|
76
|
+
},
|
77
|
+
}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
package forth
|
2
2
|
|
3
3
|
// Source: exercism/problem-specifications
|
4
|
-
// Commit:
|
5
|
-
// Problem Specifications Version: 1.
|
4
|
+
// Commit: 9bf041b forth: Add tests for case-insensitivity (#979)
|
5
|
+
// Problem Specifications Version: 1.4.0
|
6
6
|
|
7
7
|
type testGroup struct {
|
8
8
|
group string
|
@@ -135,13 +135,13 @@ var testGroups = []testGroup{
|
|
135
135
|
group: "dup",
|
136
136
|
tests: []testCase{
|
137
137
|
{
|
138
|
-
"copies
|
139
|
-
[]string{"1
|
138
|
+
"copies a value on the stack",
|
139
|
+
[]string{"1 dup"},
|
140
140
|
[]int{1, 1},
|
141
141
|
},
|
142
142
|
{
|
143
|
-
"
|
144
|
-
[]string{"1 2
|
143
|
+
"copies the top value on the stack",
|
144
|
+
[]string{"1 2 dup"},
|
145
145
|
[]int{1, 2, 2},
|
146
146
|
},
|
147
147
|
{
|
@@ -261,4 +261,39 @@ var testGroups = []testGroup{
|
|
261
261
|
},
|
262
262
|
},
|
263
263
|
},
|
264
|
+
{
|
265
|
+
group: "case-insensitivity",
|
266
|
+
tests: []testCase{
|
267
|
+
{
|
268
|
+
"DUP is case-insensitive",
|
269
|
+
[]string{"1 DUP Dup dup"},
|
270
|
+
[]int{1, 1, 1, 1},
|
271
|
+
},
|
272
|
+
{
|
273
|
+
"DROP is case-insensitive",
|
274
|
+
[]string{"1 2 3 4 DROP Drop drop"},
|
275
|
+
[]int{1},
|
276
|
+
},
|
277
|
+
{
|
278
|
+
"SWAP is case-insensitive",
|
279
|
+
[]string{"1 2 SWAP 3 Swap 4 swap"},
|
280
|
+
[]int{2, 3, 4, 1},
|
281
|
+
},
|
282
|
+
{
|
283
|
+
"OVER is case-insensitive",
|
284
|
+
[]string{"1 2 OVER Over over"},
|
285
|
+
[]int{1, 2, 1, 2, 1},
|
286
|
+
},
|
287
|
+
{
|
288
|
+
"user-defined words are case-insensitive",
|
289
|
+
[]string{": foo dup ;", "1 FOO Foo foo"},
|
290
|
+
[]int{1, 1, 1, 1},
|
291
|
+
},
|
292
|
+
{
|
293
|
+
"definitions are case-insensitive",
|
294
|
+
[]string{": SWAP DUP Dup dup ;", "1 swap"},
|
295
|
+
[]int{1, 1, 1, 1},
|
296
|
+
},
|
297
|
+
},
|
298
|
+
},
|
264
299
|
}
|
@@ -20,12 +20,22 @@ func main() {
|
|
20
20
|
|
21
21
|
// The JSON structure we expect to be able to unmarshal into
|
22
22
|
type js struct {
|
23
|
-
Cases []
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
23
|
+
Cases []oneCase
|
24
|
+
}
|
25
|
+
|
26
|
+
type oneCase struct {
|
27
|
+
Description string
|
28
|
+
Strand1 string
|
29
|
+
Strand2 string
|
30
|
+
Expected interface{}
|
31
|
+
}
|
32
|
+
|
33
|
+
func (o oneCase) Want() int {
|
34
|
+
d, ok := o.Expected.(float64)
|
35
|
+
if ok {
|
36
|
+
return int(d)
|
28
37
|
}
|
38
|
+
return -1
|
29
39
|
}
|
30
40
|
|
31
41
|
// template applied to above data structure generates the Go test cases
|
@@ -41,7 +51,7 @@ var testCases = []struct {
|
|
41
51
|
{{range .J.Cases}}{ // {{.Description}}
|
42
52
|
{{printf "%q" .Strand1}},
|
43
53
|
{{printf "%q" .Strand2}},
|
44
|
-
{{.
|
54
|
+
{{.Want}},
|
45
55
|
},
|
46
56
|
{{end}}}
|
47
57
|
`
|
@@ -1,8 +1,8 @@
|
|
1
1
|
package hamming
|
2
2
|
|
3
|
-
// Source: exercism/
|
4
|
-
// Commit:
|
5
|
-
//
|
3
|
+
// Source: exercism/problem-specifications
|
4
|
+
// Commit: f79dfd7 Simplify two tests so the difference is easily spotted.
|
5
|
+
// Problem Specifications Version: 2.0.1
|
6
6
|
|
7
7
|
var testCases = []struct {
|
8
8
|
s1 string
|
@@ -50,13 +50,13 @@ var testCases = []struct {
|
|
50
50
|
2,
|
51
51
|
},
|
52
52
|
{ // non-unique character in first strand
|
53
|
-
"
|
54
|
-
"
|
53
|
+
"AAG",
|
54
|
+
"AAA",
|
55
55
|
1,
|
56
56
|
},
|
57
57
|
{ // non-unique character in second strand
|
58
|
-
"
|
59
|
-
"
|
58
|
+
"AAA",
|
59
|
+
"AAG",
|
60
60
|
1,
|
61
61
|
},
|
62
62
|
{ // same nucleotides in different positions
|
@@ -0,0 +1,44 @@
|
|
1
|
+
package main
|
2
|
+
|
3
|
+
import (
|
4
|
+
"log"
|
5
|
+
"text/template"
|
6
|
+
|
7
|
+
"../../../gen"
|
8
|
+
)
|
9
|
+
|
10
|
+
func main() {
|
11
|
+
t, err := template.New("").Parse(tmpl)
|
12
|
+
if err != nil {
|
13
|
+
log.Fatal(err)
|
14
|
+
}
|
15
|
+
var j js
|
16
|
+
if err := gen.Gen("isbn-verifier", &j, t); err != nil {
|
17
|
+
log.Fatal(err)
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
type OneCase struct {
|
22
|
+
Description string
|
23
|
+
Input string
|
24
|
+
Expected bool
|
25
|
+
}
|
26
|
+
|
27
|
+
// The JSON structure we expect to be able to unmarshal into
|
28
|
+
type js struct {
|
29
|
+
Cases []OneCase
|
30
|
+
}
|
31
|
+
|
32
|
+
// template applied to above data structure generates the Go test cases
|
33
|
+
var tmpl = `package isbn
|
34
|
+
|
35
|
+
{{.Header}}
|
36
|
+
|
37
|
+
var testCases = []struct {
|
38
|
+
isbn string
|
39
|
+
expected bool
|
40
|
+
description string
|
41
|
+
}{
|
42
|
+
{{range .J.Cases}}{ "{{.Input}}", {{.Expected}}, "{{.Description}}"},
|
43
|
+
{{end}}}
|
44
|
+
`
|
@@ -0,0 +1,25 @@
|
|
1
|
+
package isbn
|
2
|
+
|
3
|
+
// Source: exercism/problem-specifications
|
4
|
+
// Commit: 3251fa6 Rename property for isbn-verifier exercise
|
5
|
+
// Problem Specifications Version: 2.0.0
|
6
|
+
|
7
|
+
var testCases = []struct {
|
8
|
+
isbn string
|
9
|
+
expected bool
|
10
|
+
description string
|
11
|
+
}{
|
12
|
+
{"3-598-21508-8", true, "valid isbn number"},
|
13
|
+
{"3-598-21508-9", false, "invalid isbn check digit"},
|
14
|
+
{"3-598-21507-X", true, "valid isbn number with a check digit of 10"},
|
15
|
+
{"3-598-21507-A", false, "check digit is a character other than X"},
|
16
|
+
{"3-598-2K507-0", false, "invalid character in isbn"},
|
17
|
+
{"3-598-2X507-9", false, "X is only valid as a check digit"},
|
18
|
+
{"3598215088", true, "valid isbn without separating dashes"},
|
19
|
+
{"359821507X", true, "isbn without separating dashes and X as check digit"},
|
20
|
+
{"359821507", false, "isbn without check digit and dashes"},
|
21
|
+
{"3598215078X", false, "too long isbn and no dashes"},
|
22
|
+
{"3-598-21507", false, "isbn without check digit"},
|
23
|
+
{"3-598-21507-XX", false, "too long isbn"},
|
24
|
+
{"3-598-21515-X", false, "check digit of X should not be used for 0"},
|
25
|
+
}
|
@@ -32,8 +32,8 @@ func dropHyphen(isbn string) string {
|
|
32
32
|
|
33
33
|
func strToSlice(isbn string) (result []int, err error) {
|
34
34
|
|
35
|
-
for
|
36
|
-
if unicode.IsLetter(char) && char != 'X' {
|
35
|
+
for pos, char := range isbn {
|
36
|
+
if unicode.IsLetter(char) && (char != 'X' || pos != 9) {
|
37
37
|
err = errors.New("invalid character")
|
38
38
|
return
|
39
39
|
} else if char == 'X' {
|
@@ -4,32 +4,13 @@ import (
|
|
4
4
|
"testing"
|
5
5
|
)
|
6
6
|
|
7
|
-
var testCases = []struct {
|
8
|
-
isbn string
|
9
|
-
expected bool
|
10
|
-
description string
|
11
|
-
}{
|
12
|
-
{"3-598-21508-8", true, "valid isbn number"},
|
13
|
-
{"3-598-21508-9", false, "invalid isbn check digit"},
|
14
|
-
{"3-598-21507-X", true, "valid isbn number with a check digit of 10"},
|
15
|
-
{"3-598-21507-A", false, "check digit is a character other than X"},
|
16
|
-
{"3-598-2K507-0", false, "invalid character in isbn"},
|
17
|
-
{"3-598-2X507-0", false, "X is only valid as a check digit"},
|
18
|
-
{"3598215088", true, "valid isbn without separating dashes"},
|
19
|
-
{"359821507X", true, "isbn without separating dashes and X as check digit"},
|
20
|
-
{"359821507", false, "isbn without check digit and dashes"},
|
21
|
-
{"3598215078X", false, "too long isbn and no dashes"},
|
22
|
-
{"3-598-21507", false, "isbn without check digit"},
|
23
|
-
{"3-598-21507-XA", false, "too long isbn"},
|
24
|
-
{"3-598-21515-X", false, "check digit of X should not be used for 0"},
|
25
|
-
}
|
26
|
-
|
27
7
|
func TestIsValidISBN(t *testing.T) {
|
28
8
|
for _, test := range testCases {
|
29
9
|
observed := IsValidISBN(test.isbn)
|
30
10
|
if observed != test.expected {
|
31
|
-
t.
|
32
|
-
|
11
|
+
t.Errorf("FAIL: %s\nIsValidISBN(%q)\nExpected: %t, Actual: %t",
|
12
|
+
test.description, test.isbn, test.expected, observed)
|
33
13
|
}
|
14
|
+
t.Logf("PASS: %s", test.description)
|
34
15
|
}
|
35
16
|
}
|