trackler 2.2.1.22 → 2.2.1.23
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/lib/trackler/version.rb +1 -1
- data/tracks/bash/exercises/bob/bob_test.sh +8 -6
- data/tracks/bash/exercises/bob/example.sh +30 -6
- data/tracks/coffeescript/docs/SNIPPET.txt +4 -0
- data/tracks/csharp/generators/Exercises/Allergies.cs +0 -2
- data/tracks/csharp/generators/Exercises/Anagram.cs +0 -2
- data/tracks/csharp/generators/Exercises/BinarySearch.cs +0 -2
- data/tracks/csharp/generators/Exercises/ComplexNumbers.cs +0 -2
- data/tracks/csharp/generators/Exercises/RailFenceCipher.cs +1 -2
- data/tracks/csharp/generators/Exercises/SpaceAge.cs +0 -3
- data/tracks/csharp/generators/Input/CanonicalDataCase.cs +37 -2
- data/tracks/dart/docs/SNIPPET.txt +5 -0
- data/tracks/ecmascript/exercises/simple-cipher/simple-cipher.spec.js +5 -1
- data/tracks/elm/docs/SNIPPET.txt +10 -0
- data/tracks/fortran/docs/SNIPPET.txt +9 -0
- data/tracks/fsharp/.gitignore +2 -2
- data/tracks/fsharp/.travis.yml +18 -5
- data/tracks/fsharp/build.cake +92 -0
- data/tracks/fsharp/build.ps1 +81 -0
- data/tracks/fsharp/build.sh +56 -33
- data/tracks/fsharp/config.json +14 -14
- data/tracks/fsharp/docs/INSTALLATION.md +14 -45
- data/tracks/fsharp/docs/TESTS.md +12 -25
- data/tracks/fsharp/exercises/Exercises.sln +648 -0
- data/tracks/fsharp/exercises/accumulate/Accumulate.fs +3 -0
- data/tracks/fsharp/exercises/accumulate/Accumulate.fsproj +22 -0
- data/tracks/fsharp/exercises/accumulate/AccumulateTest.fs +18 -22
- data/tracks/fsharp/exercises/accumulate/HINTS.md +1 -0
- data/tracks/fsharp/exercises/accumulate/Program.fs +1 -0
- data/tracks/fsharp/exercises/acronym/Acronym.fs +3 -0
- data/tracks/fsharp/exercises/acronym/Acronym.fsproj +22 -0
- data/tracks/fsharp/exercises/acronym/AcronymTest.fs +18 -24
- data/tracks/fsharp/exercises/acronym/Program.fs +1 -0
- data/tracks/fsharp/exercises/all-your-base/AllYourBase.fs +3 -0
- data/tracks/fsharp/exercises/all-your-base/AllYourBase.fsproj +22 -0
- data/tracks/fsharp/exercises/all-your-base/AllYourBaseTest.fs +45 -64
- data/tracks/fsharp/exercises/all-your-base/Program.fs +1 -0
- data/tracks/fsharp/exercises/allergies/Allergies.fs +9 -0
- data/tracks/fsharp/exercises/allergies/Allergies.fsproj +22 -0
- data/tracks/fsharp/exercises/allergies/AllergiesTest.fs +47 -51
- data/tracks/fsharp/exercises/allergies/Program.fs +1 -0
- data/tracks/fsharp/exercises/alphametics/Alphametics.fs +3 -0
- data/tracks/fsharp/exercises/alphametics/Alphametics.fsproj +22 -0
- data/tracks/fsharp/exercises/alphametics/AlphameticsTest.fs +19 -25
- data/tracks/fsharp/exercises/alphametics/Example.fs +13 -13
- data/tracks/fsharp/exercises/alphametics/Program.fs +1 -0
- data/tracks/fsharp/exercises/anagram/Anagram.fs +3 -0
- data/tracks/fsharp/exercises/anagram/Anagram.fsproj +22 -0
- data/tracks/fsharp/exercises/anagram/AnagramTest.fs +22 -33
- data/tracks/fsharp/exercises/anagram/Program.fs +1 -0
- data/tracks/fsharp/exercises/atbash-cipher/AtbashCipher.fs +3 -0
- data/tracks/fsharp/exercises/atbash-cipher/AtbashCipher.fsproj +22 -0
- data/tracks/fsharp/exercises/atbash-cipher/{AtbashTest.fs → AtbashCipherTest.fs} +18 -24
- data/tracks/fsharp/exercises/atbash-cipher/Program.fs +1 -0
- data/tracks/fsharp/exercises/bank-account/BankAccount.fs +11 -0
- data/tracks/fsharp/exercises/bank-account/BankAccount.fsproj +22 -0
- data/tracks/fsharp/exercises/bank-account/BankAccountTest.fs +16 -19
- data/tracks/fsharp/exercises/bank-account/Program.fs +1 -0
- data/tracks/fsharp/exercises/beer-song/BeerSong.fs +7 -0
- data/tracks/fsharp/exercises/beer-song/BeerSong.fsproj +22 -0
- data/tracks/fsharp/exercises/beer-song/BeerSongTest.fs +17 -22
- data/tracks/fsharp/exercises/beer-song/Program.fs +1 -0
- data/tracks/fsharp/exercises/binary-search/BinarySearch.fs +3 -0
- data/tracks/fsharp/exercises/binary-search/BinarySearch.fsproj +22 -0
- data/tracks/fsharp/exercises/binary-search/BinarySearchTest.fs +21 -28
- data/tracks/fsharp/exercises/binary-search/Program.fs +1 -0
- data/tracks/fsharp/exercises/binary-search-tree/BinarySearchTree.fs +15 -0
- data/tracks/fsharp/exercises/binary-search-tree/BinarySearchTree.fsproj +22 -0
- data/tracks/fsharp/exercises/binary-search-tree/BinarySearchTreeTest.fs +31 -38
- data/tracks/fsharp/exercises/binary-search-tree/Program.fs +1 -0
- data/tracks/fsharp/exercises/bob/Bob.fs +3 -0
- data/tracks/fsharp/exercises/bob/Bob.fsproj +22 -0
- data/tracks/fsharp/exercises/bob/BobTest.fs +33 -46
- data/tracks/fsharp/exercises/bob/Program.fs +1 -0
- data/tracks/fsharp/exercises/book-store/BookStore.fs +3 -0
- data/tracks/fsharp/exercises/book-store/BookStore.fsproj +22 -0
- data/tracks/fsharp/exercises/book-store/BookStoreTest.fs +27 -37
- data/tracks/fsharp/exercises/book-store/Program.fs +1 -0
- data/tracks/fsharp/exercises/bowling/Bowling.fs +7 -0
- data/tracks/fsharp/exercises/bowling/Bowling.fsproj +22 -0
- data/tracks/fsharp/exercises/bowling/BowlingTest.fs +75 -97
- data/tracks/fsharp/exercises/bowling/Example.fs +1 -1
- data/tracks/fsharp/exercises/bowling/Program.fs +1 -0
- data/tracks/fsharp/exercises/bracket-push/BracketPush.fs +3 -0
- data/tracks/fsharp/exercises/bracket-push/BracketPush.fsproj +22 -0
- data/tracks/fsharp/exercises/bracket-push/BracketPushTest.fs +27 -37
- data/tracks/fsharp/exercises/bracket-push/Program.fs +1 -0
- data/tracks/fsharp/exercises/change/Change.fs +3 -0
- data/tracks/fsharp/exercises/change/Change.fsproj +22 -0
- data/tracks/fsharp/exercises/change/ChangeTest.fs +19 -25
- data/tracks/fsharp/exercises/change/Program.fs +1 -0
- data/tracks/fsharp/exercises/circular-buffer/CircularBuffer.fs +11 -0
- data/tracks/fsharp/exercises/circular-buffer/CircularBuffer.fsproj +22 -0
- data/tracks/fsharp/exercises/circular-buffer/CircularBufferTest.fs +36 -42
- data/tracks/fsharp/exercises/circular-buffer/Program.fs +1 -0
- data/tracks/fsharp/exercises/clock/Clock.fs +9 -0
- data/tracks/fsharp/exercises/clock/Clock.fsproj +22 -0
- data/tracks/fsharp/exercises/clock/ClockTest.fs +34 -48
- data/tracks/fsharp/exercises/clock/Program.fs +1 -0
- data/tracks/fsharp/exercises/connect/Connect.fs +3 -0
- data/tracks/fsharp/exercises/connect/Connect.fsproj +22 -0
- data/tracks/fsharp/exercises/connect/ConnectTest.fs +19 -25
- data/tracks/fsharp/exercises/connect/Program.fs +1 -0
- data/tracks/fsharp/exercises/crypto-square/CryptoSquare.fs +44 -0
- data/tracks/fsharp/exercises/crypto-square/CryptoSquare.fsproj +22 -0
- data/tracks/fsharp/exercises/crypto-square/CryptoSquareTest.fs +28 -39
- data/tracks/fsharp/exercises/crypto-square/Program.fs +1 -0
- data/tracks/fsharp/exercises/custom-set/CustomSet.fs +29 -0
- data/tracks/fsharp/exercises/custom-set/CustomSet.fsproj +22 -0
- data/tracks/fsharp/exercises/custom-set/CustomSetTest.fs +77 -119
- data/tracks/fsharp/exercises/custom-set/Program.fs +1 -0
- data/tracks/fsharp/exercises/diamond/Diamond.fs +3 -0
- data/tracks/fsharp/exercises/diamond/Diamond.fsproj +22 -0
- data/tracks/fsharp/exercises/diamond/DiamondTest.fs +31 -27
- data/tracks/fsharp/exercises/diamond/Program.fs +1 -0
- data/tracks/fsharp/exercises/difference-of-squares/DifferenceOfSquares.fs +7 -0
- data/tracks/fsharp/exercises/difference-of-squares/DifferenceOfSquares.fsproj +22 -0
- data/tracks/fsharp/exercises/difference-of-squares/DifferenceOfSquaresTest.fs +21 -28
- data/tracks/fsharp/exercises/difference-of-squares/Program.fs +1 -0
- data/tracks/fsharp/exercises/diffie-hellman/DiffieHellman.fs +7 -0
- data/tracks/fsharp/exercises/diffie-hellman/DiffieHellman.fsproj +22 -0
- data/tracks/fsharp/exercises/diffie-hellman/DiffieHellmanTest.fs +16 -19
- data/tracks/fsharp/exercises/diffie-hellman/Program.fs +1 -0
- data/tracks/fsharp/exercises/dominoes/Dominoes.fs +3 -0
- data/tracks/fsharp/exercises/dominoes/Dominoes.fsproj +22 -0
- data/tracks/fsharp/exercises/dominoes/DominoesTest.fs +27 -37
- data/tracks/fsharp/exercises/dominoes/Program.fs +1 -0
- data/tracks/fsharp/exercises/dot-dsl/DotDsl.fs +15 -0
- data/tracks/fsharp/exercises/dot-dsl/DotDsl.fsproj +22 -0
- data/tracks/fsharp/exercises/dot-dsl/DotDslTest.fs +27 -31
- data/tracks/fsharp/exercises/dot-dsl/Program.fs +1 -0
- data/tracks/fsharp/exercises/error-handling/ErrorHandling.fs +11 -0
- data/tracks/fsharp/exercises/error-handling/ErrorHandling.fsproj +22 -0
- data/tracks/fsharp/exercises/error-handling/ErrorHandlingTest.fs +20 -25
- data/tracks/fsharp/exercises/error-handling/Program.fs +1 -0
- data/tracks/fsharp/exercises/etl/Etl.fs +3 -0
- data/tracks/fsharp/exercises/etl/Etl.fsproj +22 -0
- data/tracks/fsharp/exercises/etl/{ETLTest.fs → EtlTest.fs} +11 -13
- data/tracks/fsharp/exercises/etl/Program.fs +1 -0
- data/tracks/fsharp/exercises/food-chain/FoodChain.fs +5 -0
- data/tracks/fsharp/exercises/food-chain/FoodChain.fsproj +22 -0
- data/tracks/fsharp/exercises/food-chain/FoodChainTest.fs +13 -16
- data/tracks/fsharp/exercises/food-chain/Program.fs +1 -0
- data/tracks/fsharp/exercises/forth/Forth.fs +3 -0
- data/tracks/fsharp/exercises/forth/Forth.fsproj +22 -0
- data/tracks/fsharp/exercises/forth/ForthTest.fs +44 -57
- data/tracks/fsharp/exercises/forth/Program.fs +1 -0
- data/tracks/fsharp/exercises/gigasecond/Gigasecond.fs +3 -0
- data/tracks/fsharp/exercises/gigasecond/Gigasecond.fsproj +22 -0
- data/tracks/fsharp/exercises/gigasecond/GigasecondTest.fs +9 -10
- data/tracks/fsharp/exercises/gigasecond/Program.fs +1 -0
- data/tracks/fsharp/exercises/go-counting/GoCounting.fs +3 -0
- data/tracks/fsharp/exercises/go-counting/GoCounting.fsproj +22 -0
- data/tracks/fsharp/exercises/go-counting/GoCountingTest.fs +23 -30
- data/tracks/fsharp/exercises/go-counting/Program.fs +1 -0
- data/tracks/fsharp/exercises/grade-school/Example.fs +1 -1
- data/tracks/fsharp/exercises/grade-school/GradeSchool.fs +9 -0
- data/tracks/fsharp/exercises/grade-school/GradeSchool.fsproj +22 -0
- data/tracks/fsharp/exercises/grade-school/GradeSchoolTest.fs +17 -22
- data/tracks/fsharp/exercises/grade-school/Program.fs +1 -0
- data/tracks/fsharp/exercises/grains/Grains.fs +6 -0
- data/tracks/fsharp/exercises/grains/Grains.fsproj +22 -0
- data/tracks/fsharp/exercises/grains/GrainsTest.fs +19 -25
- data/tracks/fsharp/exercises/grains/Program.fs +1 -0
- data/tracks/fsharp/exercises/grep/Grep.fs +3 -0
- data/tracks/fsharp/exercises/grep/Grep.fsproj +22 -0
- data/tracks/fsharp/exercises/grep/GrepTest.fs +332 -348
- data/tracks/fsharp/exercises/grep/Program.fs +1 -0
- data/tracks/fsharp/exercises/hamming/Hamming.fs +3 -0
- data/tracks/fsharp/exercises/hamming/Hamming.fsproj +22 -0
- data/tracks/fsharp/exercises/hamming/HammingTest.fs +15 -19
- data/tracks/fsharp/exercises/hamming/Program.fs +1 -0
- data/tracks/fsharp/exercises/hangman/Hangman.fs +3 -0
- data/tracks/fsharp/exercises/hangman/Hangman.fsproj +22 -0
- data/tracks/fsharp/exercises/hangman/HangmanTest.fs +30 -34
- data/tracks/fsharp/exercises/hangman/Program.fs +1 -0
- data/tracks/fsharp/exercises/hello-world/HelloWorld.fs +3 -0
- data/tracks/fsharp/exercises/hello-world/HelloWorld.fsproj +22 -0
- data/tracks/fsharp/exercises/hello-world/HelloWorldTest.fs +5 -4
- data/tracks/fsharp/exercises/hello-world/Program.fs +1 -0
- data/tracks/fsharp/exercises/house/House.fs +3 -0
- data/tracks/fsharp/exercises/house/House.fsproj +22 -0
- data/tracks/fsharp/exercises/house/HouseTest.fs +5 -4
- data/tracks/fsharp/exercises/house/Program.fs +1 -0
- data/tracks/fsharp/exercises/isogram/Isogram.fs +3 -0
- data/tracks/fsharp/exercises/isogram/Isogram.fsproj +22 -0
- data/tracks/fsharp/exercises/isogram/IsogramTest.fs +21 -28
- data/tracks/fsharp/exercises/isogram/Program.fs +1 -0
- data/tracks/fsharp/exercises/kindergarten-garden/KindergartenGarden.fs +9 -0
- data/tracks/fsharp/exercises/kindergarten-garden/KindergartenGarden.fsproj +22 -0
- data/tracks/fsharp/exercises/kindergarten-garden/KindergartenGardenTest.fs +51 -0
- data/tracks/fsharp/exercises/kindergarten-garden/Program.fs +1 -0
- data/tracks/fsharp/exercises/largest-series-product/LargestSeriesProduct.fs +3 -0
- data/tracks/fsharp/exercises/largest-series-product/LargestSeriesProduct.fsproj +22 -0
- data/tracks/fsharp/exercises/largest-series-product/LargestSeriesProductTest.fs +27 -22
- data/tracks/fsharp/exercises/largest-series-product/Program.fs +1 -0
- data/tracks/fsharp/exercises/leap/Leap.fs +3 -0
- data/tracks/fsharp/exercises/leap/Leap.fsproj +22 -0
- data/tracks/fsharp/exercises/leap/LeapTest.fs +11 -13
- data/tracks/fsharp/exercises/leap/Program.fs +1 -0
- data/tracks/fsharp/exercises/ledger/Ledger.fsproj +22 -0
- data/tracks/fsharp/exercises/ledger/LedgerTest.fs +23 -22
- data/tracks/fsharp/exercises/ledger/Program.fs +1 -0
- data/tracks/fsharp/exercises/lens-person/LensPerson.fs +1 -22
- data/tracks/fsharp/exercises/lens-person/LensPerson.fsproj +23 -0
- data/tracks/fsharp/exercises/lens-person/LensPersonTest.fs +11 -13
- data/tracks/fsharp/exercises/lens-person/Program.fs +1 -0
- data/tracks/fsharp/exercises/linked-list/LinkedList.fs +13 -0
- data/tracks/fsharp/exercises/linked-list/LinkedList.fsproj +22 -0
- data/tracks/fsharp/exercises/linked-list/LinkedListTest.fs +28 -33
- data/tracks/fsharp/exercises/linked-list/Program.fs +1 -0
- data/tracks/fsharp/exercises/list-ops/ListOps.fs +17 -0
- data/tracks/fsharp/exercises/list-ops/ListOps.fsproj +22 -0
- data/tracks/fsharp/exercises/list-ops/ListOpsTest.fs +51 -73
- data/tracks/fsharp/exercises/list-ops/Program.fs +1 -0
- data/tracks/fsharp/exercises/luhn/Luhn.fs +3 -0
- data/tracks/fsharp/exercises/luhn/Luhn.fsproj +22 -0
- data/tracks/fsharp/exercises/luhn/LuhnTest.fs +28 -39
- data/tracks/fsharp/exercises/luhn/Program.fs +1 -0
- data/tracks/fsharp/exercises/markdown/Markdown.fsproj +22 -0
- data/tracks/fsharp/exercises/markdown/MarkdownTest.fs +21 -20
- data/tracks/fsharp/exercises/markdown/Program.fs +1 -0
- data/tracks/fsharp/exercises/matrix/Matrix.fs +7 -0
- data/tracks/fsharp/exercises/matrix/Matrix.fsproj +22 -0
- data/tracks/fsharp/exercises/matrix/MatrixTest.fs +76 -48
- data/tracks/fsharp/exercises/matrix/Program.fs +1 -0
- data/tracks/fsharp/exercises/meetup/Meetup.fs +7 -0
- data/tracks/fsharp/exercises/meetup/Meetup.fsproj +22 -0
- data/tracks/fsharp/exercises/meetup/MeetupTest.fs +67 -60
- data/tracks/fsharp/exercises/meetup/Program.fs +1 -0
- data/tracks/fsharp/exercises/minesweeper/Minesweeper.fs +3 -0
- data/tracks/fsharp/exercises/minesweeper/Minesweeper.fsproj +22 -0
- data/tracks/fsharp/exercises/minesweeper/MinesweeperTest.fs +17 -22
- data/tracks/fsharp/exercises/minesweeper/Program.fs +1 -0
- data/tracks/fsharp/exercises/nth-prime/NthPrime.fs +3 -0
- data/tracks/fsharp/exercises/nth-prime/NthPrime.fsproj +22 -0
- data/tracks/fsharp/exercises/nth-prime/NthPrimeTest.fs +25 -34
- data/tracks/fsharp/exercises/nth-prime/Program.fs +1 -0
- data/tracks/fsharp/exercises/nucleotide-count/NucleotideCount.fs +5 -0
- data/tracks/fsharp/exercises/nucleotide-count/NucleotideCount.fsproj +22 -0
- data/tracks/fsharp/exercises/nucleotide-count/NucleotideCountTest.fs +17 -21
- data/tracks/fsharp/exercises/nucleotide-count/Program.fs +1 -0
- data/tracks/fsharp/exercises/ocr-numbers/OcrNumbers.fs +3 -0
- data/tracks/fsharp/exercises/ocr-numbers/OcrNumbers.fsproj +22 -0
- data/tracks/fsharp/exercises/ocr-numbers/OcrNumbersTest.fs +33 -46
- data/tracks/fsharp/exercises/ocr-numbers/Program.fs +1 -0
- data/tracks/fsharp/exercises/palindrome-products/PalindromeProducts.fs +5 -0
- data/tracks/fsharp/exercises/palindrome-products/PalindromeProducts.fsproj +22 -0
- data/tracks/fsharp/exercises/palindrome-products/PalindromeProductsTest.fs +54 -0
- data/tracks/fsharp/exercises/palindrome-products/Program.fs +1 -0
- data/tracks/fsharp/exercises/pangram/Pangram.fs +3 -0
- data/tracks/fsharp/exercises/pangram/Pangram.fsproj +22 -0
- data/tracks/fsharp/exercises/pangram/PangramTest.fs +23 -31
- data/tracks/fsharp/exercises/pangram/Program.fs +1 -0
- data/tracks/fsharp/exercises/parallel-letter-frequency/ParallelLetterFrequency.fs +3 -0
- data/tracks/fsharp/exercises/parallel-letter-frequency/ParallelLetterFrequency.fsproj +22 -0
- data/tracks/fsharp/exercises/parallel-letter-frequency/ParallelLetterFrequencyTest.fs +27 -35
- data/tracks/fsharp/exercises/parallel-letter-frequency/Program.fs +1 -0
- data/tracks/fsharp/exercises/pascals-triangle/PascalsTriangle.fs +3 -0
- data/tracks/fsharp/exercises/pascals-triangle/PascalsTriangle.fsproj +22 -0
- data/tracks/fsharp/exercises/pascals-triangle/PascalsTriangleTest.fs +15 -19
- data/tracks/fsharp/exercises/pascals-triangle/Program.fs +1 -0
- data/tracks/fsharp/exercises/perfect-numbers/PerfectNumbers.fs +5 -0
- data/tracks/fsharp/exercises/perfect-numbers/PerfectNumbers.fsproj +22 -0
- data/tracks/fsharp/exercises/perfect-numbers/PerfectNumbersTest.fs +18 -14
- data/tracks/fsharp/exercises/perfect-numbers/Program.fs +1 -0
- data/tracks/fsharp/exercises/phone-number/PhoneNumber.fs +3 -0
- data/tracks/fsharp/exercises/phone-number/PhoneNumber.fsproj +22 -0
- data/tracks/fsharp/exercises/phone-number/PhoneNumberTest.fs +23 -31
- data/tracks/fsharp/exercises/phone-number/Program.fs +1 -0
- data/tracks/fsharp/exercises/pig-latin/PigLatin.fs +3 -0
- data/tracks/fsharp/exercises/pig-latin/PigLatin.fsproj +22 -0
- data/tracks/fsharp/exercises/pig-latin/PigLatinTest.fs +39 -44
- data/tracks/fsharp/exercises/pig-latin/Program.fs +1 -0
- data/tracks/fsharp/exercises/poker/Poker.fs +3 -0
- data/tracks/fsharp/exercises/poker/Poker.fsproj +22 -0
- data/tracks/fsharp/exercises/poker/PokerTest.fs +40 -56
- data/tracks/fsharp/exercises/poker/Program.fs +1 -0
- data/tracks/fsharp/exercises/pov/Pov.fs +3 -0
- data/tracks/fsharp/exercises/pov/Pov.fsproj +22 -0
- data/tracks/fsharp/exercises/pov/PovTest.fs +23 -31
- data/tracks/fsharp/exercises/pov/Program.fs +1 -0
- data/tracks/fsharp/exercises/prime-factors/Example.fs +1 -1
- data/tracks/fsharp/exercises/prime-factors/PrimeFactors.fs +3 -0
- data/tracks/fsharp/exercises/prime-factors/PrimeFactors.fsproj +22 -0
- data/tracks/fsharp/exercises/prime-factors/PrimeFactorsTest.fs +22 -30
- data/tracks/fsharp/exercises/prime-factors/Program.fs +1 -0
- data/tracks/fsharp/exercises/protein-translation/Program.fs +1 -0
- data/tracks/fsharp/exercises/protein-translation/ProteinTranslation.fs +3 -0
- data/tracks/fsharp/exercises/protein-translation/ProteinTranslation.fsproj +22 -0
- data/tracks/fsharp/exercises/protein-translation/ProteinTranslationTest.fs +41 -36
- data/tracks/fsharp/exercises/proverb/Program.fs +1 -0
- data/tracks/fsharp/exercises/proverb/Proverb.fs +5 -0
- data/tracks/fsharp/exercises/proverb/Proverb.fsproj +22 -0
- data/tracks/fsharp/exercises/proverb/ProverbTest.fs +11 -13
- data/tracks/fsharp/exercises/pythagorean-triplet/Program.fs +1 -0
- data/tracks/fsharp/exercises/pythagorean-triplet/PythagoreanTriplet.fs +7 -0
- data/tracks/fsharp/exercises/pythagorean-triplet/PythagoreanTriplet.fsproj +22 -0
- data/tracks/fsharp/exercises/pythagorean-triplet/PythagoreanTripletTest.fs +19 -20
- data/tracks/fsharp/exercises/queen-attack/Program.fs +1 -0
- data/tracks/fsharp/exercises/queen-attack/QueenAttack.fs +3 -0
- data/tracks/fsharp/exercises/queen-attack/QueenAttack.fsproj +22 -0
- data/tracks/fsharp/exercises/queen-attack/QueenAttackTest.fs +19 -25
- data/tracks/fsharp/exercises/rail-fence-cipher/Program.fs +1 -0
- data/tracks/fsharp/exercises/rail-fence-cipher/RailFenceCipher.fs +5 -0
- data/tracks/fsharp/exercises/rail-fence-cipher/RailFenceCipher.fsproj +22 -0
- data/tracks/fsharp/exercises/rail-fence-cipher/RailFenceCipherTest.fs +15 -19
- data/tracks/fsharp/exercises/raindrops/Program.fs +1 -0
- data/tracks/fsharp/exercises/raindrops/Raindrops.fs +3 -0
- data/tracks/fsharp/exercises/raindrops/Raindrops.fsproj +22 -0
- data/tracks/fsharp/exercises/raindrops/RaindropsTest.fs +30 -24
- data/tracks/fsharp/exercises/react/Program.fs +1 -0
- data/tracks/fsharp/exercises/react/React.fs +3 -0
- data/tracks/fsharp/exercises/react/React.fsproj +22 -0
- data/tracks/fsharp/exercises/react/ReactTest.fs +26 -31
- data/tracks/fsharp/exercises/rectangles/Program.fs +1 -0
- data/tracks/fsharp/exercises/rectangles/Rectangles.fs +3 -0
- data/tracks/fsharp/exercises/rectangles/Rectangles.fsproj +22 -0
- data/tracks/fsharp/exercises/rectangles/RectanglesTest.fs +23 -31
- data/tracks/fsharp/exercises/rna-transcription/Program.fs +1 -0
- data/tracks/fsharp/exercises/rna-transcription/RnaTranscription.fs +3 -0
- data/tracks/fsharp/exercises/rna-transcription/RnaTranscription.fsproj +22 -0
- data/tracks/fsharp/exercises/rna-transcription/RnaTranscriptionTest.fs +26 -0
- data/tracks/fsharp/exercises/robot-name/Program.fs +1 -0
- data/tracks/fsharp/exercises/robot-name/RobotName.fs +7 -0
- data/tracks/fsharp/exercises/robot-name/RobotName.fsproj +22 -0
- data/tracks/fsharp/exercises/robot-name/RobotNameTest.fs +12 -13
- data/tracks/fsharp/exercises/robot-simulator/Program.fs +1 -0
- data/tracks/fsharp/exercises/robot-simulator/RobotSimulator.fs +13 -0
- data/tracks/fsharp/exercises/robot-simulator/RobotSimulator.fsproj +22 -0
- data/tracks/fsharp/exercises/robot-simulator/RobotSimulatorTest.fs +16 -20
- data/tracks/fsharp/exercises/roman-numerals/Program.fs +1 -0
- data/tracks/fsharp/exercises/roman-numerals/RomanNumerals.fs +3 -0
- data/tracks/fsharp/exercises/roman-numerals/RomanNumerals.fsproj +22 -0
- data/tracks/fsharp/exercises/roman-numerals/RomanNumeralsTest.fs +28 -0
- data/tracks/fsharp/exercises/run-length-encoding/Program.fs +1 -0
- data/tracks/fsharp/exercises/run-length-encoding/RunLengthEncoding.fs +5 -0
- data/tracks/fsharp/exercises/run-length-encoding/RunLengthEncoding.fsproj +22 -0
- data/tracks/fsharp/exercises/run-length-encoding/RunLengthEncodingTest.fs +17 -22
- data/tracks/fsharp/exercises/saddle-points/Program.fs +1 -0
- data/tracks/fsharp/exercises/saddle-points/SaddlePoints.fs +3 -0
- data/tracks/fsharp/exercises/saddle-points/SaddlePoints.fsproj +22 -0
- data/tracks/fsharp/exercises/saddle-points/{SaddlePointTest.fs → SaddlePointsTest.fs} +13 -16
- data/tracks/fsharp/exercises/say/Program.fs +1 -0
- data/tracks/fsharp/exercises/say/Say.fs +3 -0
- data/tracks/fsharp/exercises/say/Say.fsproj +22 -0
- data/tracks/fsharp/exercises/say/SayTest.fs +35 -49
- data/tracks/fsharp/exercises/scale-generator/Program.fs +1 -0
- data/tracks/fsharp/exercises/scale-generator/ScaleGenerator.fs +3 -0
- data/tracks/fsharp/exercises/scale-generator/ScaleGenerator.fsproj +22 -0
- data/tracks/fsharp/exercises/scale-generator/ScaleGeneratorTest.fs +31 -43
- data/tracks/fsharp/exercises/scrabble-score/Program.fs +1 -0
- data/tracks/fsharp/exercises/scrabble-score/ScrabbleScore.fs +3 -0
- data/tracks/fsharp/exercises/scrabble-score/ScrabbleScore.fsproj +22 -0
- data/tracks/fsharp/exercises/scrabble-score/ScrabbleScoreTest.fs +18 -24
- data/tracks/fsharp/exercises/secret-handshake/Program.fs +1 -0
- data/tracks/fsharp/exercises/secret-handshake/SecretHandshake.fs +3 -0
- data/tracks/fsharp/exercises/secret-handshake/SecretHandshake.fsproj +22 -0
- data/tracks/fsharp/exercises/secret-handshake/SecretHandshakeTest.fs +17 -22
- data/tracks/fsharp/exercises/series/Program.fs +1 -0
- data/tracks/fsharp/exercises/series/Series.fs +3 -0
- data/tracks/fsharp/exercises/series/Series.fsproj +22 -0
- data/tracks/fsharp/exercises/series/SeriesTest.fs +53 -55
- data/tracks/fsharp/exercises/sgf-parsing/Program.fs +1 -0
- data/tracks/fsharp/exercises/sgf-parsing/SgfParsing.fs +3 -0
- data/tracks/fsharp/exercises/sgf-parsing/SgfParsing.fsproj +22 -0
- data/tracks/fsharp/exercises/sgf-parsing/SgfParsingTest.fs +27 -37
- data/tracks/fsharp/exercises/sieve/Program.fs +1 -0
- data/tracks/fsharp/exercises/sieve/Sieve.fs +3 -0
- data/tracks/fsharp/exercises/sieve/Sieve.fsproj +22 -0
- data/tracks/fsharp/exercises/sieve/SieveTest.fs +19 -21
- data/tracks/fsharp/exercises/simple-cipher/Program.fs +1 -0
- data/tracks/fsharp/exercises/simple-cipher/SimpleCipher.fs +7 -0
- data/tracks/fsharp/exercises/simple-cipher/SimpleCipher.fsproj +22 -0
- data/tracks/fsharp/exercises/simple-cipher/SimpleCipherTest.fs +39 -54
- data/tracks/fsharp/exercises/simple-linked-list/Program.fs +1 -0
- data/tracks/fsharp/exercises/simple-linked-list/SimpleLinkedList.fs +36 -0
- data/tracks/fsharp/exercises/simple-linked-list/SimpleLinkedList.fsproj +22 -0
- data/tracks/fsharp/exercises/simple-linked-list/SimpleLinkedListTest.fs +36 -40
- data/tracks/fsharp/exercises/space-age/Program.fs +1 -0
- data/tracks/fsharp/exercises/space-age/SpaceAge.fs +5 -0
- data/tracks/fsharp/exercises/space-age/SpaceAge.fsproj +22 -0
- data/tracks/fsharp/exercises/space-age/SpaceAgeTest.fs +26 -32
- data/tracks/fsharp/exercises/strain/Program.fs +1 -0
- data/tracks/fsharp/exercises/strain/Strain.fs +5 -0
- data/tracks/fsharp/exercises/strain/Strain.fsproj +22 -0
- data/tracks/fsharp/exercises/strain/StrainTest.fs +28 -47
- data/tracks/fsharp/exercises/sublist/Program.fs +1 -0
- data/tracks/fsharp/exercises/sublist/Sublist.fs +5 -0
- data/tracks/fsharp/exercises/sublist/Sublist.fsproj +22 -0
- data/tracks/fsharp/exercises/sublist/SublistTest.fs +39 -55
- data/tracks/fsharp/exercises/sum-of-multiples/Program.fs +1 -0
- data/tracks/fsharp/exercises/sum-of-multiples/SumOfMultiples.fs +3 -0
- data/tracks/fsharp/exercises/sum-of-multiples/SumOfMultiples.fsproj +22 -0
- data/tracks/fsharp/exercises/sum-of-multiples/SumOfMultiplesTest.fs +15 -19
- data/tracks/fsharp/exercises/tournament/Program.fs +1 -0
- data/tracks/fsharp/exercises/tournament/Tournament.fs +3 -0
- data/tracks/fsharp/exercises/tournament/Tournament.fsproj +22 -0
- data/tracks/fsharp/exercises/tournament/TournamentTest.fs +9 -10
- data/tracks/fsharp/exercises/transpose/Program.fs +1 -0
- data/tracks/fsharp/exercises/transpose/Transpose.fs +3 -0
- data/tracks/fsharp/exercises/transpose/Transpose.fsproj +22 -0
- data/tracks/fsharp/exercises/transpose/TransposeTest.fs +25 -34
- data/tracks/fsharp/exercises/tree-building/Program.fs +1 -0
- data/tracks/fsharp/exercises/tree-building/TreeBuilding.fsproj +22 -0
- data/tracks/fsharp/exercises/tree-building/TreeBuildingTest.fs +84 -82
- data/tracks/fsharp/exercises/triangle/Program.fs +1 -0
- data/tracks/fsharp/exercises/triangle/Triangle.fs +8 -0
- data/tracks/fsharp/exercises/triangle/Triangle.fsproj +22 -0
- data/tracks/fsharp/exercises/triangle/TriangleTest.fs +31 -43
- data/tracks/fsharp/exercises/twelve-days/Program.fs +1 -0
- data/tracks/fsharp/exercises/twelve-days/TwelveDays.fs +7 -0
- data/tracks/fsharp/exercises/twelve-days/TwelveDays.fsproj +22 -0
- data/tracks/fsharp/exercises/twelve-days/TwelveDaysTest.fs +31 -43
- data/tracks/fsharp/exercises/two-bucket/Program.fs +1 -0
- data/tracks/fsharp/exercises/two-bucket/TwoBucket.fs +3 -0
- data/tracks/fsharp/exercises/two-bucket/TwoBucket.fsproj +22 -0
- data/tracks/fsharp/exercises/two-bucket/TwoBucketTest.fs +11 -13
- data/tracks/fsharp/exercises/two-fer/Program.fs +1 -0
- data/tracks/fsharp/exercises/two-fer/TwoFer.fs +3 -0
- data/tracks/fsharp/exercises/two-fer/TwoFer.fsproj +22 -0
- data/tracks/fsharp/exercises/two-fer/TwoFerTest.fs +9 -10
- data/tracks/fsharp/exercises/variable-length-quantity/Program.fs +1 -0
- data/tracks/fsharp/exercises/variable-length-quantity/VariableLengthQuantity.fs +3 -0
- data/tracks/fsharp/exercises/variable-length-quantity/VariableLengthQuantity.fsproj +22 -0
- data/tracks/fsharp/exercises/variable-length-quantity/VariableLengthQuantityTest.fs +42 -50
- data/tracks/fsharp/exercises/word-count/Program.fs +1 -0
- data/tracks/fsharp/exercises/word-count/WordCount.fs +3 -0
- data/tracks/fsharp/exercises/word-count/WordCount.fsproj +22 -0
- data/tracks/fsharp/exercises/word-count/WordCountTest.fs +27 -37
- data/tracks/fsharp/exercises/word-search/Program.fs +1 -0
- data/tracks/fsharp/exercises/word-search/WordSearch.fs +3 -0
- data/tracks/fsharp/exercises/word-search/WordSearch.fsproj +22 -0
- data/tracks/fsharp/exercises/word-search/WordSearchTest.fs +23 -31
- data/tracks/fsharp/exercises/wordy/Program.fs +1 -0
- data/tracks/fsharp/exercises/wordy/Wordy.fs +3 -0
- data/tracks/fsharp/exercises/wordy/Wordy.fsproj +22 -0
- data/tracks/fsharp/exercises/wordy/WordyTest.fs +34 -48
- data/tracks/fsharp/exercises/zebra-puzzle/Example.fs +1 -1
- data/tracks/fsharp/exercises/zebra-puzzle/Program.fs +1 -0
- data/tracks/fsharp/exercises/zebra-puzzle/ZebraPuzzle.fs +3 -0
- data/tracks/fsharp/exercises/zebra-puzzle/ZebraPuzzle.fsproj +22 -0
- data/tracks/fsharp/exercises/zebra-puzzle/ZebraPuzzleTest.fs +9 -9
- data/tracks/fsharp/exercises/zipper/Program.fs +1 -0
- data/tracks/fsharp/exercises/zipper/Zipper.fs +3 -0
- data/tracks/fsharp/exercises/zipper/Zipper.fsproj +22 -0
- data/tracks/fsharp/exercises/zipper/ZipperTest.fs +19 -25
- data/tracks/javascript/exercises/simple-linked-list/example.js +4 -3
- data/tracks/javascript/exercises/simple-linked-list/simple-linked-list.spec.js +3 -0
- data/tracks/nim/docs/SNIPPET.txt +2 -0
- data/tracks/perl5/docs/SNIPPET.txt +9 -0
- data/tracks/php/docs/SNIPPET.txt +6 -0
- data/tracks/pony/docs/SNIPPET.txt +2 -0
- data/tracks/powershell/docs/SNIPPET.txt +4 -0
- data/tracks/prolog/docs/SNIPPET.txt +6 -0
- data/tracks/python/exercises/simple-cipher/README.md +1 -1
- data/tracks/vimscript/docs/SNIPPET.txt +4 -0
- metadata +334 -17
- data/tracks/fsharp/.paket/paket.bootstrapper.exe +0 -0
- data/tracks/fsharp/build.cmd +0 -14
- data/tracks/fsharp/build.fsx +0 -65
- data/tracks/fsharp/exercises/app.config +0 -11
- data/tracks/fsharp/exercises/exercises.fsproj +0 -225
- data/tracks/fsharp/exercises/kindergarten-garden/KinderGartenGardenTest.fs +0 -55
- data/tracks/fsharp/exercises/paket.references +0 -4
- data/tracks/fsharp/exercises/palindrome-products/PalindromeTest.fs +0 -60
- data/tracks/fsharp/exercises/rna-transcription/RNATranscriptionTest.fs +0 -29
- data/tracks/fsharp/exercises/roman-numerals/RomanNumeralTest.fs +0 -26
- data/tracks/fsharp/paket.dependencies +0 -8
- data/tracks/fsharp/paket.lock +0 -11
|
@@ -1,113 +1,98 @@
|
|
|
1
1
|
module SimpleCipherTest
|
|
2
2
|
|
|
3
3
|
open System
|
|
4
|
-
open
|
|
4
|
+
open System.Text.RegularExpressions
|
|
5
|
+
open Xunit
|
|
6
|
+
open FsUnit.Xunit
|
|
5
7
|
|
|
6
8
|
open SimpleCipher
|
|
7
9
|
|
|
8
10
|
let plainText = "abcdefghij"
|
|
9
11
|
let key = "abcdefghij";
|
|
10
12
|
|
|
11
|
-
[<
|
|
13
|
+
[<Fact>]
|
|
12
14
|
let ``Encode random uses key made of letters`` () =
|
|
13
15
|
let (key, _) = encodeRandom plainText
|
|
14
|
-
|
|
16
|
+
Regex.IsMatch(key, "[a-z]+") |> should equal true
|
|
15
17
|
|
|
16
|
-
[<
|
|
17
|
-
[<Ignore("Remove to run test")>]
|
|
18
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
18
19
|
let ``Encode random uses key of 100 characters`` () =
|
|
19
20
|
let (key, _) = encodeRandom plainText
|
|
20
|
-
|
|
21
|
+
key |> should haveLength 100
|
|
21
22
|
|
|
22
|
-
[<
|
|
23
|
-
[<Ignore("Remove to run test")>]
|
|
23
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
24
24
|
let ``Encode random uses randomly generated key`` () =
|
|
25
25
|
let keys = List.init 100 (fun _ -> encodeRandom plainText |> fst)
|
|
26
|
-
|
|
26
|
+
keys |> List.distinct |> should equal keys
|
|
27
27
|
|
|
28
28
|
// Here we take advantage of the fact that plaintext of "aaa..." outputs
|
|
29
29
|
// the key. This is a critical problem with shift ciphers, some characters
|
|
30
30
|
// will always output the key verbatim.
|
|
31
|
-
[<
|
|
32
|
-
[<Ignore("Remove to run test")>]
|
|
31
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
33
32
|
let ``Encode random can encode`` () =
|
|
34
33
|
let (key, encoded) = encodeRandom "aaaaaaaaaa"
|
|
35
|
-
|
|
34
|
+
encoded |> should equal <| key.Substring(0, 10)
|
|
36
35
|
|
|
37
|
-
[<
|
|
38
|
-
[<Ignore("Remove to run test")>]
|
|
36
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
39
37
|
let ``Encode random can decode`` () =
|
|
40
38
|
let (key, _) = encodeRandom "aaaaaaaaaa"
|
|
41
|
-
|
|
39
|
+
decode key (key.Substring(0, 10)) |> should equal "aaaaaaaaaa"
|
|
42
40
|
|
|
43
|
-
[<
|
|
44
|
-
[<Ignore("Remove to run test")>]
|
|
41
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
45
42
|
let ``Encode random is reversible`` () =
|
|
46
43
|
let (key, encoded) = encodeRandom plainText
|
|
47
|
-
|
|
44
|
+
decode key encoded |> should equal plainText
|
|
48
45
|
|
|
49
|
-
[<
|
|
50
|
-
[<Ignore("Remove to run test")>]
|
|
46
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
51
47
|
let ``Cipher can encode with given key`` () =
|
|
52
|
-
|
|
48
|
+
encode key "aaaaaaaaaa" |> should equal "abcdefghij"
|
|
53
49
|
|
|
54
|
-
[<
|
|
55
|
-
[<Ignore("Remove to run test")>]
|
|
50
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
56
51
|
let ``Cipher can decode with given key`` () =
|
|
57
|
-
|
|
52
|
+
decode key "abcdefghij" |> should equal "aaaaaaaaaa"
|
|
58
53
|
|
|
59
|
-
[<
|
|
60
|
-
[<Ignore("Remove to run test")>]
|
|
54
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
61
55
|
let ``Cipher is reversible given key`` () =
|
|
62
|
-
|
|
56
|
+
encode key plainText |> decode key |> should equal plainText
|
|
63
57
|
|
|
64
|
-
[<
|
|
65
|
-
[<Ignore("Remove to run test")>]
|
|
58
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
66
59
|
let ``Cipher can double shift encode`` () =
|
|
67
60
|
let plainText = "iamapandabear"
|
|
68
|
-
|
|
61
|
+
encode plainText plainText |> should equal "qayaeaagaciai"
|
|
69
62
|
|
|
70
|
-
[<
|
|
71
|
-
[<Ignore("Remove to run test")>]
|
|
63
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
72
64
|
let ``Cipher can wrap encode`` () =
|
|
73
|
-
|
|
65
|
+
encode key "zzzzzzzzzz" |> should equal "zabcdefghi"
|
|
74
66
|
|
|
75
|
-
[<
|
|
76
|
-
[<Ignore("Remove to run test")>]
|
|
67
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
77
68
|
let ``Cipher can encode a message that is shorter than the key`` () =
|
|
78
|
-
|
|
69
|
+
encode key "aaaaa" |> should equal "abcde"
|
|
79
70
|
|
|
80
|
-
[<
|
|
81
|
-
[<Ignore("Remove to run test")>]
|
|
71
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
82
72
|
let ``Cipher can decode a message that is shorter than the key`` () =
|
|
83
|
-
|
|
73
|
+
decode key "abcde" |> should equal "aaaaa"
|
|
84
74
|
|
|
85
|
-
[<
|
|
86
|
-
[<Ignore("Remove to run test")>]
|
|
75
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
87
76
|
let ``Encode throws with an all caps key`` () =
|
|
88
77
|
let key = "ABCDEF"
|
|
89
|
-
|
|
78
|
+
(fun () -> encode key plainText |> ignore) |> should throw typeof<Exception>
|
|
90
79
|
|
|
91
|
-
[<
|
|
92
|
-
[<Ignore("Remove to run test")>]
|
|
80
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
93
81
|
let ``Encode throws with any caps key`` () =
|
|
94
82
|
let key = "abcdEFg"
|
|
95
|
-
|
|
83
|
+
(fun () -> encode key plainText |> ignore) |> should throw typeof<Exception>
|
|
96
84
|
|
|
97
|
-
[<
|
|
98
|
-
[<Ignore("Remove to run test")>]
|
|
85
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
99
86
|
let ``Encode throws with numeric key`` () =
|
|
100
87
|
let key = "12345"
|
|
101
|
-
|
|
88
|
+
(fun () -> encode key plainText |> ignore) |> should throw typeof<Exception>
|
|
102
89
|
|
|
103
|
-
[<
|
|
104
|
-
[<Ignore("Remove to run test")>]
|
|
90
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
105
91
|
let ``Encode throws with any numeric key`` () =
|
|
106
92
|
let key = "abcd345ef"
|
|
107
|
-
|
|
93
|
+
(fun () -> encode key plainText |> ignore) |> should throw typeof<Exception>
|
|
108
94
|
|
|
109
|
-
[<
|
|
110
|
-
[<Ignore("Remove to run test")>]
|
|
95
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
111
96
|
let ``Encode throws with empty key`` () =
|
|
112
97
|
let key = ""
|
|
113
|
-
|
|
98
|
+
(fun () -> encode key plainText |> ignore) |> should throw typeof<Exception>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module Program = let [<EntryPoint>] main _ = 0
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module SimpleLinkedList
|
|
2
|
+
|
|
3
|
+
type LinkedList<'a> =
|
|
4
|
+
| Nil
|
|
5
|
+
| Element of datum:'a * next:LinkedList<'a>
|
|
6
|
+
|
|
7
|
+
let nil = Nil
|
|
8
|
+
|
|
9
|
+
let create x n = Element (x, n)
|
|
10
|
+
|
|
11
|
+
let isNil x =
|
|
12
|
+
match x with
|
|
13
|
+
| Nil -> true
|
|
14
|
+
| _ -> false
|
|
15
|
+
|
|
16
|
+
let next x =
|
|
17
|
+
match x with
|
|
18
|
+
| Nil -> Nil
|
|
19
|
+
| Element (_, n) -> n
|
|
20
|
+
|
|
21
|
+
let datum x =
|
|
22
|
+
match x with
|
|
23
|
+
| Nil -> failwith "The nil list has no datum."
|
|
24
|
+
| Element (y, _) -> y
|
|
25
|
+
|
|
26
|
+
let toList x =
|
|
27
|
+
let rec loop acc item =
|
|
28
|
+
match item with
|
|
29
|
+
| Nil -> acc |> List.rev
|
|
30
|
+
| Element (b, n) -> loop (b :: acc) n
|
|
31
|
+
|
|
32
|
+
loop [] x
|
|
33
|
+
|
|
34
|
+
let fromList xs = List.foldBack create xs Nil
|
|
35
|
+
|
|
36
|
+
let reverse x = x |> toList |> List.rev |> fromList
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
|
2
|
+
|
|
3
|
+
<PropertyGroup>
|
|
4
|
+
<TargetFramework>netcoreapp2.0</TargetFramework>
|
|
5
|
+
|
|
6
|
+
<IsPackable>false</IsPackable>
|
|
7
|
+
</PropertyGroup>
|
|
8
|
+
|
|
9
|
+
<ItemGroup>
|
|
10
|
+
<Compile Include="SimpleLinkedList.fs" />
|
|
11
|
+
<Compile Include="SimpleLinkedListTest.fs" />
|
|
12
|
+
<Compile Include="Program.fs" />
|
|
13
|
+
</ItemGroup>
|
|
14
|
+
|
|
15
|
+
<ItemGroup>
|
|
16
|
+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
|
|
17
|
+
<PackageReference Include="xunit" Version="2.3.0-beta5-build3769" />
|
|
18
|
+
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.0-beta5-build3769" />
|
|
19
|
+
<PackageReference Include="FsUnit.xUnit" Version="3.0.0" />
|
|
20
|
+
</ItemGroup>
|
|
21
|
+
|
|
22
|
+
</Project>
|
|
@@ -1,75 +1,71 @@
|
|
|
1
|
-
|
|
1
|
+
module SimpleLinkedListTest
|
|
2
2
|
|
|
3
|
-
open
|
|
3
|
+
open Xunit
|
|
4
|
+
open FsUnit.Xunit
|
|
4
5
|
|
|
5
6
|
open SimpleLinkedList
|
|
6
7
|
|
|
7
|
-
[<
|
|
8
|
+
[<Fact>]
|
|
8
9
|
let ``Empty list`` () =
|
|
9
10
|
let list = nil
|
|
10
|
-
|
|
11
|
+
isNil list |> should equal true
|
|
11
12
|
|
|
12
|
-
[<
|
|
13
|
-
[<Ignore("Remove to run test")>]
|
|
13
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
14
14
|
let ``Single item list value`` () =
|
|
15
15
|
let list = create 1 nil
|
|
16
|
-
|
|
16
|
+
datum list |> should equal 1
|
|
17
17
|
|
|
18
|
-
[<
|
|
19
|
-
[<Ignore("Remove to run test")>]
|
|
18
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
20
19
|
let ``Single item list has no next item`` () =
|
|
21
20
|
let list = create 1 nil
|
|
22
|
-
|
|
21
|
+
next list |> isNil |> should equal true
|
|
23
22
|
|
|
24
|
-
[<
|
|
25
|
-
[<Ignore("Remove to run test")>]
|
|
23
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
26
24
|
let ``Two item list first value`` () =
|
|
27
25
|
let list = create 2 (create 1 nil)
|
|
28
|
-
|
|
26
|
+
datum list |> should equal 2
|
|
29
27
|
|
|
30
|
-
[<
|
|
31
|
-
[<Ignore("Remove to run test")>]
|
|
28
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
32
29
|
let ``Two item list second value`` () =
|
|
33
30
|
let list = create 2 (create 1 nil)
|
|
34
|
-
|
|
31
|
+
next list |> datum |> should equal 1
|
|
35
32
|
|
|
36
|
-
[<
|
|
37
|
-
[<Ignore("Remove to run test")>]
|
|
33
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
38
34
|
let ``Two item list second item has no next`` () =
|
|
39
35
|
let list = create 2 (create 1 nil)
|
|
40
|
-
|
|
36
|
+
next list |> next |> isNil |> should equal true
|
|
41
37
|
|
|
42
|
-
[<
|
|
43
|
-
[<Ignore("Remove to run test")>]
|
|
38
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
44
39
|
let ``To list`` () =
|
|
45
40
|
let values = create 2 (create 1 nil) |> toList
|
|
46
|
-
|
|
41
|
+
values |> should equal [2; 1]
|
|
47
42
|
|
|
48
|
-
[<
|
|
49
|
-
[<Ignore("Remove to run test")>]
|
|
43
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
50
44
|
let ``From list`` () =
|
|
51
45
|
let list = fromList [11; 7; 5; 3; 2]
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
[<
|
|
59
|
-
[<
|
|
60
|
-
[<
|
|
61
|
-
[<
|
|
46
|
+
list |> datum |> should equal 11
|
|
47
|
+
list |> next |> datum |> should equal 7
|
|
48
|
+
list |> next |> next |> datum |> should equal 5
|
|
49
|
+
list |> next |> next |> next |> datum |> should equal 3
|
|
50
|
+
list |> next |> next |> next |> next |> datum |> should equal 2
|
|
51
|
+
|
|
52
|
+
[<Theory(Skip = "Remove to run test")>]
|
|
53
|
+
[<InlineData(1)>]
|
|
54
|
+
[<InlineData(2)>]
|
|
55
|
+
[<InlineData(10)>]
|
|
56
|
+
[<InlineData(100)>]
|
|
62
57
|
let ``Reverse`` (length: int) =
|
|
63
58
|
let values = [1..length]
|
|
64
59
|
let list = fromList values
|
|
65
60
|
let reversed = reverse list
|
|
66
|
-
|
|
61
|
+
reversed |> toList |> should equal <| List.rev values
|
|
67
62
|
|
|
68
|
-
[<
|
|
69
|
-
[<
|
|
70
|
-
[<
|
|
71
|
-
[<
|
|
63
|
+
[<Theory(Skip = "Remove to run test")>]
|
|
64
|
+
[<InlineData(1)>]
|
|
65
|
+
[<InlineData(2)>]
|
|
66
|
+
[<InlineData(10)>]
|
|
67
|
+
[<InlineData(100)>]
|
|
72
68
|
let ``Roundtrip`` (length: int) =
|
|
73
69
|
let values = [1..length]
|
|
74
70
|
let listValues = fromList values
|
|
75
|
-
|
|
71
|
+
listValues |> toList |> should equal values
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module Program = let [<EntryPoint>] main _ = 0
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
|
2
|
+
|
|
3
|
+
<PropertyGroup>
|
|
4
|
+
<TargetFramework>netcoreapp2.0</TargetFramework>
|
|
5
|
+
|
|
6
|
+
<IsPackable>false</IsPackable>
|
|
7
|
+
</PropertyGroup>
|
|
8
|
+
|
|
9
|
+
<ItemGroup>
|
|
10
|
+
<Compile Include="SpaceAge.fs" />
|
|
11
|
+
<Compile Include="SpaceAgeTest.fs" />
|
|
12
|
+
<Compile Include="Program.fs" />
|
|
13
|
+
</ItemGroup>
|
|
14
|
+
|
|
15
|
+
<ItemGroup>
|
|
16
|
+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
|
|
17
|
+
<PackageReference Include="xunit" Version="2.3.0-beta5-build3769" />
|
|
18
|
+
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.0-beta5-build3769" />
|
|
19
|
+
<PackageReference Include="FsUnit.xUnit" Version="3.0.0" />
|
|
20
|
+
</ItemGroup>
|
|
21
|
+
|
|
22
|
+
</Project>
|
|
@@ -1,58 +1,52 @@
|
|
|
1
|
-
|
|
1
|
+
module SpaceAgeTest
|
|
2
2
|
|
|
3
|
-
open
|
|
3
|
+
open Xunit
|
|
4
|
+
open FsUnit.Xunit
|
|
4
5
|
open SpaceAge
|
|
5
6
|
|
|
6
|
-
[<
|
|
7
|
+
[<Fact>]
|
|
7
8
|
let ``Age on earth`` () =
|
|
8
9
|
let seconds = 1000000000m
|
|
9
|
-
|
|
10
|
+
spaceAge Planet.Earth seconds |> should equal 31.69m
|
|
10
11
|
|
|
11
|
-
[<
|
|
12
|
-
[<Ignore("Remove to run test")>]
|
|
12
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
13
13
|
let ``Age on mercury`` () =
|
|
14
14
|
let seconds = 2134835688m
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
spaceAge Planet.Earth seconds |> should equal 67.65m
|
|
16
|
+
spaceAge Planet.Mercury seconds |> should equal 280.88m
|
|
17
17
|
|
|
18
|
-
[<
|
|
19
|
-
[<Ignore("Remove to run test")>]
|
|
18
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
20
19
|
let ``Age on venus`` () =
|
|
21
20
|
let seconds = 189839836m
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
spaceAge Planet.Earth seconds |> should equal 6.02m
|
|
22
|
+
spaceAge Planet.Venus seconds |> should equal 9.78m
|
|
24
23
|
|
|
25
|
-
[<
|
|
26
|
-
[<Ignore("Remove to run test")>]
|
|
24
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
27
25
|
let ``Age on mars`` () =
|
|
28
26
|
let seconds = 2329871239m
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
spaceAge Planet.Earth seconds |> should equal 73.83m
|
|
28
|
+
spaceAge Planet.Mars seconds |> should equal 39.25m
|
|
31
29
|
|
|
32
|
-
[<
|
|
33
|
-
[<Ignore("Remove to run test")>]
|
|
30
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
34
31
|
let ``Age on jupiter`` () =
|
|
35
32
|
let seconds = 901876382m
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
spaceAge Planet.Earth seconds |> should equal 28.58m
|
|
34
|
+
spaceAge Planet.Jupiter seconds |> should equal 2.41m
|
|
38
35
|
|
|
39
|
-
[<
|
|
40
|
-
[<Ignore("Remove to run test")>]
|
|
36
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
41
37
|
let ``Age on saturn`` () =
|
|
42
38
|
let seconds = 3000000000m
|
|
43
|
-
|
|
44
|
-
|
|
39
|
+
spaceAge Planet.Earth seconds |> should equal 95.06m
|
|
40
|
+
spaceAge Planet.Saturn seconds |> should equal 3.23m
|
|
45
41
|
|
|
46
|
-
[<
|
|
47
|
-
[<Ignore("Remove to run test")>]
|
|
42
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
48
43
|
let ``Age on uranus`` () =
|
|
49
44
|
let seconds = 3210123456m
|
|
50
|
-
|
|
51
|
-
|
|
45
|
+
spaceAge Planet.Earth seconds |> should equal 101.72m
|
|
46
|
+
spaceAge Planet.Uranus seconds |> should equal 1.21m
|
|
52
47
|
|
|
53
|
-
[<
|
|
54
|
-
[<Ignore("Remove to run test")>]
|
|
48
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
55
49
|
let ``Age on neptune`` () =
|
|
56
50
|
let seconds = 8210123456m
|
|
57
|
-
|
|
58
|
-
|
|
51
|
+
spaceAge Planet.Earth seconds |> should equal 260.16m
|
|
52
|
+
spaceAge Planet.Neptune seconds |> should equal 1.58m
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module Program = let [<EntryPoint>] main _ = 0
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
|
2
|
+
|
|
3
|
+
<PropertyGroup>
|
|
4
|
+
<TargetFramework>netcoreapp2.0</TargetFramework>
|
|
5
|
+
|
|
6
|
+
<IsPackable>false</IsPackable>
|
|
7
|
+
</PropertyGroup>
|
|
8
|
+
|
|
9
|
+
<ItemGroup>
|
|
10
|
+
<Compile Include="Strain.fs" />
|
|
11
|
+
<Compile Include="StrainTest.fs" />
|
|
12
|
+
<Compile Include="Program.fs" />
|
|
13
|
+
</ItemGroup>
|
|
14
|
+
|
|
15
|
+
<ItemGroup>
|
|
16
|
+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
|
|
17
|
+
<PackageReference Include="xunit" Version="2.3.0-beta5-build3769" />
|
|
18
|
+
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.0-beta5-build3769" />
|
|
19
|
+
<PackageReference Include="FsUnit.xUnit" Version="3.0.0" />
|
|
20
|
+
</ItemGroup>
|
|
21
|
+
|
|
22
|
+
</Project>
|
|
@@ -1,44 +1,31 @@
|
|
|
1
1
|
module StrainTest
|
|
2
2
|
|
|
3
3
|
open System.Collections.Specialized
|
|
4
|
-
open
|
|
4
|
+
open Xunit
|
|
5
|
+
open FsUnit.Xunit
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
// functions in a module matching the existing module name. Your code
|
|
8
|
-
// should thus look something like this:
|
|
9
|
-
|
|
10
|
-
// module Seq
|
|
11
|
-
//
|
|
12
|
-
// let keep pred xs = ???
|
|
13
|
-
// let discard pred xs = ???
|
|
14
|
-
|
|
15
|
-
[<Test>]
|
|
7
|
+
[<Fact>]
|
|
16
8
|
let ``Empty keep`` () =
|
|
17
|
-
|
|
9
|
+
[] |> Seq.keep (fun x -> x < 10) |> should be Empty
|
|
18
10
|
|
|
19
|
-
[<
|
|
20
|
-
[<Ignore("Remove to run test")>]
|
|
11
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
21
12
|
let ``Keep everything`` () =
|
|
22
|
-
|
|
13
|
+
set [1; 2; 3] |> Seq.keep (fun x -> x < 10) |> Seq.toList |> should equal <| [1; 2; 3]
|
|
23
14
|
|
|
24
|
-
[<
|
|
25
|
-
[<Ignore("Remove to run test")>]
|
|
15
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
26
16
|
let ``Keep first and last`` () =
|
|
27
|
-
|
|
17
|
+
[|1; 2; 3|] |> Seq.keep (fun x -> x % 2 <> 0) |> Seq.toList |> should equal [1; 3]
|
|
28
18
|
|
|
29
|
-
[<
|
|
30
|
-
[<Ignore("Remove to run test")>]
|
|
19
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
31
20
|
let ``Keep neither first nor last`` () =
|
|
32
|
-
|
|
21
|
+
[1; 2; 3; 4; 5] |> Seq.keep (fun x -> x % 2 = 0) |> Seq.toList |> should equal [2; 4]
|
|
33
22
|
|
|
34
|
-
[<
|
|
35
|
-
[<Ignore("Remove to run test")>]
|
|
23
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
36
24
|
let ``Keep strings`` () =
|
|
37
25
|
let words = "apple zebra banana zombies cherimoya zelot".Split(' ');
|
|
38
|
-
|
|
26
|
+
words |> Seq.keep (fun (x:string) -> x.StartsWith("z")) |> Seq.toList |> should equal <| List.ofArray("zebra zombies zelot".Split(' '))
|
|
39
27
|
|
|
40
|
-
[<
|
|
41
|
-
[<Ignore("Remove to run test")>]
|
|
28
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
42
29
|
let ``Keep arrays`` () =
|
|
43
30
|
let actual = [|
|
|
44
31
|
[|1; 2; 3|];
|
|
@@ -49,37 +36,31 @@ let ``Keep arrays`` () =
|
|
|
49
36
|
[|2; 2; 1|];
|
|
50
37
|
[|1; 2; 5|]
|
|
51
38
|
|]
|
|
52
|
-
let expected = [
|
|
53
|
-
|
|
39
|
+
let expected = [ [|5; 5; 5|]; [|5; 1; 2|]; [|1; 5; 2|]; [|1; 2; 5|] ]
|
|
40
|
+
actual |> Seq.keep (Array.exists ((=) 5)) |> Seq.toList |> should equal expected
|
|
54
41
|
|
|
55
|
-
[<
|
|
56
|
-
[<Ignore("Remove to run test")>]
|
|
42
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
57
43
|
let ``Empty discard`` () =
|
|
58
|
-
|
|
44
|
+
[] |> Seq.discard (fun x -> x < 10) |> should be Empty
|
|
59
45
|
|
|
60
|
-
[<
|
|
61
|
-
[<Ignore("Remove to run test")>]
|
|
46
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
62
47
|
let ``Discard nothing`` () =
|
|
63
|
-
|
|
48
|
+
set [1; 2; 3] |> Seq.discard (fun x -> x > 10) |> Seq.toList |> should equal <| [1; 2; 3]
|
|
64
49
|
|
|
65
|
-
[<
|
|
66
|
-
[<Ignore("Remove to run test")>]
|
|
50
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
67
51
|
let ``Discard first and last`` () =
|
|
68
|
-
|
|
52
|
+
[|1; 2; 3|] |> Seq.discard (fun x -> x % 2 <> 0) |> Seq.toList |> should equal [2]
|
|
69
53
|
|
|
70
|
-
[<
|
|
71
|
-
[<Ignore("Remove to run test")>]
|
|
54
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
72
55
|
let ``Discard neither first nor last`` () =
|
|
73
|
-
|
|
56
|
+
[1; 2; 3; 4; 5] |> Seq.discard (fun x -> x % 2 = 0) |> Seq.toList |> should equal [1; 3; 5]
|
|
74
57
|
|
|
75
|
-
[<
|
|
76
|
-
[<Ignore("Remove to run test")>]
|
|
58
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
77
59
|
let ``Discard strings`` () =
|
|
78
60
|
let words = "apple zebra banana zombies cherimoya zelot".Split(' ')
|
|
79
|
-
|
|
61
|
+
words |> Seq.discard (fun (x:string) -> x.StartsWith("z")) |> Seq.toList |> should equal <| List.ofArray("apple banana cherimoya".Split(' '))
|
|
80
62
|
|
|
81
|
-
[<
|
|
82
|
-
[<Ignore("Remove to run test")>]
|
|
63
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
83
64
|
let ``Discard arrays`` () =
|
|
84
65
|
let actual = [|
|
|
85
66
|
[|1; 2; 3|];
|
|
@@ -90,5 +71,5 @@ let ``Discard arrays`` () =
|
|
|
90
71
|
[|2; 2; 1|];
|
|
91
72
|
[|1; 2; 5|]
|
|
92
73
|
|]
|
|
93
|
-
let expected = [
|
|
94
|
-
|
|
74
|
+
let expected = [ [|1; 2; 3|]; [|2; 1; 2|]; [|2; 2; 1|] ]
|
|
75
|
+
actual |> Seq.discard (Array.exists ((=) 5)) |> Seq.toList |> should equal expected
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module Program = let [<EntryPoint>] main _ = 0
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
|
2
|
+
|
|
3
|
+
<PropertyGroup>
|
|
4
|
+
<TargetFramework>netcoreapp2.0</TargetFramework>
|
|
5
|
+
|
|
6
|
+
<IsPackable>false</IsPackable>
|
|
7
|
+
</PropertyGroup>
|
|
8
|
+
|
|
9
|
+
<ItemGroup>
|
|
10
|
+
<Compile Include="Sublist.fs" />
|
|
11
|
+
<Compile Include="SublistTest.fs" />
|
|
12
|
+
<Compile Include="Program.fs" />
|
|
13
|
+
</ItemGroup>
|
|
14
|
+
|
|
15
|
+
<ItemGroup>
|
|
16
|
+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
|
|
17
|
+
<PackageReference Include="xunit" Version="2.3.0-beta5-build3769" />
|
|
18
|
+
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.0-beta5-build3769" />
|
|
19
|
+
<PackageReference Include="FsUnit.xUnit" Version="3.0.0" />
|
|
20
|
+
</ItemGroup>
|
|
21
|
+
|
|
22
|
+
</Project>
|