From 63f6d4308c956fff93340413832cbfd18e46ba01 Mon Sep 17 00:00:00 2001 From: dmitry Date: Wed, 5 Aug 2020 16:57:01 +0300 Subject: [PATCH 1/2] Add hw2 --- .../HomeworkTwo.Tests/CountsTests.fs | 46 +++++++++++++++++++ .../HomeworkTwo.Tests.fsproj | 30 ++++++++++++ .../InfinitePrimeNumbersTests.fs | 23 ++++++++++ .../HomeworkTwo.Tests/ParseTreeTests.fs | 24 ++++++++++ .../HomeworkTwo/HomeworkTwo.Tests/Program.fs | 2 + .../HomeworkTwo.Tests/TreeMapTests.fs | 17 +++++++ semester4/HomeworkTwo/HomeworkTwo.sln | 22 +++++++++ semester4/HomeworkTwo/HomeworkTwo/Count.fs | 13 ++++++ .../HomeworkTwo/HomeworkTwo.fsproj | 14 ++++++ .../HomeworkTwo/InfinitePrimeNumbers.fs | 11 +++++ .../HomeworkTwo/HomeworkTwo/ParseTree.fs | 20 ++++++++ semester4/HomeworkTwo/HomeworkTwo/TreeMap.fs | 12 +++++ 12 files changed, 234 insertions(+) create mode 100644 semester4/HomeworkTwo/HomeworkTwo.Tests/CountsTests.fs create mode 100644 semester4/HomeworkTwo/HomeworkTwo.Tests/HomeworkTwo.Tests.fsproj create mode 100644 semester4/HomeworkTwo/HomeworkTwo.Tests/InfinitePrimeNumbersTests.fs create mode 100644 semester4/HomeworkTwo/HomeworkTwo.Tests/ParseTreeTests.fs create mode 100644 semester4/HomeworkTwo/HomeworkTwo.Tests/Program.fs create mode 100644 semester4/HomeworkTwo/HomeworkTwo.Tests/TreeMapTests.fs create mode 100644 semester4/HomeworkTwo/HomeworkTwo.sln create mode 100644 semester4/HomeworkTwo/HomeworkTwo/Count.fs create mode 100644 semester4/HomeworkTwo/HomeworkTwo/HomeworkTwo.fsproj create mode 100644 semester4/HomeworkTwo/HomeworkTwo/InfinitePrimeNumbers.fs create mode 100644 semester4/HomeworkTwo/HomeworkTwo/ParseTree.fs create mode 100644 semester4/HomeworkTwo/HomeworkTwo/TreeMap.fs diff --git a/semester4/HomeworkTwo/HomeworkTwo.Tests/CountsTests.fs b/semester4/HomeworkTwo/HomeworkTwo.Tests/CountsTests.fs new file mode 100644 index 0000000..f41c052 --- /dev/null +++ b/semester4/HomeworkTwo/HomeworkTwo.Tests/CountsTests.fs @@ -0,0 +1,46 @@ +module HomeworkTwo.Tests.Counts + +open FsUnit +open FsCheck +open Counts +open NUnit.Framework + +let inputs = + [ + [1..10], 5 + [3], 0 + [2], 1 + [2; 4; 6; 8; 10], 5 + [1; 3; 5; 7; 9; 11; 13], 0 + [-1; 0; 1], 1 + [-2], 1 + [-4; -10; 241212], 3 + [], 0 + ] |> List.map (fun (list, result) -> TestCaseData(list, result)) + +[] +[] +let filterTest list count = filterCount list |> should equal count + +[] +[] +let foldTest list count = foldCount list |> should equal count + +[] +[] +let mapTest list count = mapCount list |> should equal count + +let filterEqualsMap list = filterCount list = mapCount list + +let foldEqualsMap list = foldCount list = mapCount list + +let filterEqualsFold list = filterCount list = foldCount list + +[] +let ``filter equals map``() = Check.QuickThrowOnFailure filterEqualsMap + +[] +let ``fold equals map``() = Check.QuickThrowOnFailure foldEqualsMap + +[] +let ``filter equals fold``() = Check.QuickThrowOnFailure filterEqualsFold \ No newline at end of file diff --git a/semester4/HomeworkTwo/HomeworkTwo.Tests/HomeworkTwo.Tests.fsproj b/semester4/HomeworkTwo/HomeworkTwo.Tests/HomeworkTwo.Tests.fsproj new file mode 100644 index 0000000..b0cce63 --- /dev/null +++ b/semester4/HomeworkTwo/HomeworkTwo.Tests/HomeworkTwo.Tests.fsproj @@ -0,0 +1,30 @@ + + + + netcoreapp3.1 + + false + false + + + + + + + + + + + + + + + + + + + + + + + diff --git a/semester4/HomeworkTwo/HomeworkTwo.Tests/InfinitePrimeNumbersTests.fs b/semester4/HomeworkTwo/HomeworkTwo.Tests/InfinitePrimeNumbersTests.fs new file mode 100644 index 0000000..1ca731e --- /dev/null +++ b/semester4/HomeworkTwo/HomeworkTwo.Tests/InfinitePrimeNumbersTests.fs @@ -0,0 +1,23 @@ +module HomeworkTwo.Tests.InfinitePrimeNumbersTests + +open NUnit.Framework +open PrimeSequence +open FsUnit + +let cases = + [ + 2, 0 + 3, 1 + 5, 2 + 7, 3 + 11, 4 + 13, 5 + 17, 6 + 19, 7 + 23, 8 + ] |> List.map (fun (number, pos) -> TestCaseData(number, pos)) + +[] +[] +let infinitePrimesTest number pos = + Seq.item(pos) primeSeq |> should equal number diff --git a/semester4/HomeworkTwo/HomeworkTwo.Tests/ParseTreeTests.fs b/semester4/HomeworkTwo/HomeworkTwo.Tests/ParseTreeTests.fs new file mode 100644 index 0000000..afab85f --- /dev/null +++ b/semester4/HomeworkTwo/HomeworkTwo.Tests/ParseTreeTests.fs @@ -0,0 +1,24 @@ +module HomeworkTwo.Tests.ParseTree_Tests + +open NUnit.Framework +open FsUnit +open ParseTree + +let cases = + [ + Sum(Digit(100), Digit(32)), 132 + Multiplication(Subtraction(Digit(50), Digit(3)), Digit(2)), 94 + Multiplication(Digit(5000), Digit(0)), 0 + Multiplication(Digit(5000), Digit(-1)), -5000 + Division(Digit(10), Digit(2)), 5 + Subtraction(Multiplication(Digit(13), Digit(5)), Division(Digit(25), Digit(5))), 60 + ] |> List.map (fun (tree, result) -> TestCaseData(tree, result)) + + +[] +[] +let ``simple parse tree testes`` tree result = calculateTree tree |> should equal result + +[] +let ``division by zero test`` () = + (fun () -> calculateTree (Division(Digit(10), Digit(0))) |> ignore) |> should throw typeof \ No newline at end of file diff --git a/semester4/HomeworkTwo/HomeworkTwo.Tests/Program.fs b/semester4/HomeworkTwo/HomeworkTwo.Tests/Program.fs new file mode 100644 index 0000000..75f178d --- /dev/null +++ b/semester4/HomeworkTwo/HomeworkTwo.Tests/Program.fs @@ -0,0 +1,2 @@ +module Program +let [] main _ = 0 \ No newline at end of file diff --git a/semester4/HomeworkTwo/HomeworkTwo.Tests/TreeMapTests.fs b/semester4/HomeworkTwo/HomeworkTwo.Tests/TreeMapTests.fs new file mode 100644 index 0000000..f2c4caa --- /dev/null +++ b/semester4/HomeworkTwo/HomeworkTwo.Tests/TreeMapTests.fs @@ -0,0 +1,17 @@ +module HomeworkTwo.Tests.TreeMap + +open NUnit.Framework +open FsUnit +open TreeMap + +let intTree = (Node(5, Node(3, None, None), Node(0, Node(313, Tree.None, Tree.None), Tree.None))) +let intAnswer = (Node(10, Node(6, None, None), Node(0, Node(626, Tree.None, Tree.None), Tree.None))) + +[] +let intTest () = mapTree (fun (x: int) -> (x * 2)) intTree |> should equal intAnswer + +let stringTree = (Node("Hello", Node("World", Node("Another", Node("Word", Tree.None, Tree.None), Tree.None), Tree.None), Tree.None)) +let stringAnswer = (Node("Helloa", Node("Worlda", Node("Anothera", Node("Worda", Tree.None, Tree.None), Tree.None), Tree.None), Tree.None)) + +[] +let stringTest () = mapTree (fun (x: string) -> x + "a") stringTree |> should equal stringAnswer \ No newline at end of file diff --git a/semester4/HomeworkTwo/HomeworkTwo.sln b/semester4/HomeworkTwo/HomeworkTwo.sln new file mode 100644 index 0000000..6803668 --- /dev/null +++ b/semester4/HomeworkTwo/HomeworkTwo.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "HomeworkTwo", "HomeworkTwo\HomeworkTwo.fsproj", "{0C6E1509-6286-49C0-8923-48C031618E87}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "HomeworkTwo.Tests", "HomeworkTwo.Tests\HomeworkTwo.Tests.fsproj", "{6AA3EB61-29BD-4819-BB4B-0DA0027156A6}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0C6E1509-6286-49C0-8923-48C031618E87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0C6E1509-6286-49C0-8923-48C031618E87}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0C6E1509-6286-49C0-8923-48C031618E87}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0C6E1509-6286-49C0-8923-48C031618E87}.Release|Any CPU.Build.0 = Release|Any CPU + {6AA3EB61-29BD-4819-BB4B-0DA0027156A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6AA3EB61-29BD-4819-BB4B-0DA0027156A6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6AA3EB61-29BD-4819-BB4B-0DA0027156A6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6AA3EB61-29BD-4819-BB4B-0DA0027156A6}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/semester4/HomeworkTwo/HomeworkTwo/Count.fs b/semester4/HomeworkTwo/HomeworkTwo/Count.fs new file mode 100644 index 0000000..852e2c4 --- /dev/null +++ b/semester4/HomeworkTwo/HomeworkTwo/Count.fs @@ -0,0 +1,13 @@ +module Counts + +/// Count all even numbers with filter function +let filterCount list = + List.length <| List.filter (fun x -> x % 2 = 0) list + +/// Count all even numbers with map function +let mapCount list = + List.sum <| List.map (fun x -> abs(x + 1) % 2) list + +/// Count all even numbers with fold functions +let foldCount list = + List.fold (fun acc x -> (abs(x + 1) % 2) + acc) 0 list \ No newline at end of file diff --git a/semester4/HomeworkTwo/HomeworkTwo/HomeworkTwo.fsproj b/semester4/HomeworkTwo/HomeworkTwo/HomeworkTwo.fsproj new file mode 100644 index 0000000..8333ab0 --- /dev/null +++ b/semester4/HomeworkTwo/HomeworkTwo/HomeworkTwo.fsproj @@ -0,0 +1,14 @@ + + + + netcoreapp3.1 + + + + + + + + + + diff --git a/semester4/HomeworkTwo/HomeworkTwo/InfinitePrimeNumbers.fs b/semester4/HomeworkTwo/HomeworkTwo/InfinitePrimeNumbers.fs new file mode 100644 index 0000000..1142334 --- /dev/null +++ b/semester4/HomeworkTwo/HomeworkTwo/InfinitePrimeNumbers.fs @@ -0,0 +1,11 @@ +module PrimeSequence + +/// Checks if number is prime +let isPrime n = + if n < 2 then false + else + let searchEnd = (float >> sqrt >> int) n + List.forall (fun x -> n % x <> 0)([2..searchEnd]) + +/// Creates infinity sequence of prime numbers +let primeSeq = (Seq.initInfinite id |> Seq.filter (isPrime)) \ No newline at end of file diff --git a/semester4/HomeworkTwo/HomeworkTwo/ParseTree.fs b/semester4/HomeworkTwo/HomeworkTwo/ParseTree.fs new file mode 100644 index 0000000..512df4a --- /dev/null +++ b/semester4/HomeworkTwo/HomeworkTwo/ParseTree.fs @@ -0,0 +1,20 @@ +module ParseTree + +/// Simple parse tree +type ParseTree = + | Digit of int + | Sum of ParseTree * ParseTree + | Subtraction of ParseTree * ParseTree + | Multiplication of ParseTree * ParseTree + | Division of ParseTree * ParseTree + +/// Function that calculates the result of parse tree + let rec calculateTree tree = + match tree with + | Digit x -> x + | Sum(l, r) -> calculateTree l + calculateTree r + | Subtraction(l, r) -> calculateTree l - calculateTree r + | Multiplication(l, r) -> calculateTree l * calculateTree r + | Division(l, r) -> let right = calculateTree r + if right = 0 then raise (System.DivideByZeroException()) + else (calculateTree l) / right \ No newline at end of file diff --git a/semester4/HomeworkTwo/HomeworkTwo/TreeMap.fs b/semester4/HomeworkTwo/HomeworkTwo/TreeMap.fs new file mode 100644 index 0000000..18b620e --- /dev/null +++ b/semester4/HomeworkTwo/HomeworkTwo/TreeMap.fs @@ -0,0 +1,12 @@ +module TreeMap + +/// Simple binary tree +type Tree<'a> = + | Node of 'a * Tree<'a> * Tree<'a> + | None + +/// Function that transforms tree with given function +let rec mapTree mapFunc tree = + match tree with + | None -> None + | Node(c, l, r) -> Node(mapFunc c, mapTree mapFunc l, mapTree mapFunc r) \ No newline at end of file From 100c577c6a15f7073dc8f892d2ca048bfdda2937 Mon Sep 17 00:00:00 2001 From: dmitry Date: Wed, 5 Aug 2020 16:58:55 +0300 Subject: [PATCH 2/2] update yml --- appveyor.yml | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 855f34f..6ab509e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,7 +1,17 @@ -image: Visual Studio 2017 +image: Visual Studio 2019 + +init: + - git config --global core.autocrlf true + +environment: + matrix: + - solution: Semester4/HomeworkTwo/HomeworkTwo.sln before_build: - - nuget restore semester2/6.1/HW6T2.sln + - nuget restore %solution% build: - project: semester2/2.3/2.3.sln + project: $(solution) + +test_script: + - dotnet test %solution%