diff --git a/addtask/task2/task2.sln b/addtask/task2/task2.sln new file mode 100644 index 0000000..964c4bb --- /dev/null +++ b/addtask/task2/task2.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.7.34018.315 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "task2", "task2\task2.fsproj", "{22099F0E-5FF3-4343-AD34-A10FA2A4EF6E}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "task2.tests", "task2.tests\task2.tests.fsproj", "{6BF43100-50FC-48F1-A281-4638B6801C8C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {22099F0E-5FF3-4343-AD34-A10FA2A4EF6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {22099F0E-5FF3-4343-AD34-A10FA2A4EF6E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {22099F0E-5FF3-4343-AD34-A10FA2A4EF6E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {22099F0E-5FF3-4343-AD34-A10FA2A4EF6E}.Release|Any CPU.Build.0 = Release|Any CPU + {6BF43100-50FC-48F1-A281-4638B6801C8C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6BF43100-50FC-48F1-A281-4638B6801C8C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6BF43100-50FC-48F1-A281-4638B6801C8C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6BF43100-50FC-48F1-A281-4638B6801C8C}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {7B70452C-4C6F-460B-9581-A52582E13994} + EndGlobalSection +EndGlobal diff --git a/addtask/task2/task2.tests/ParkingTests.fs b/addtask/task2/task2.tests/ParkingTests.fs new file mode 100644 index 0000000..bbe7c1b --- /dev/null +++ b/addtask/task2/task2.tests/ParkingTests.fs @@ -0,0 +1,26 @@ +module ParkingSimulation.tests + +open NUnit.Framework +open ParkingSimulation +open System.Threading +open FsUnit + +[] +let AmountOfSpacesAlwaysCorrect () = + let testParking = Parking(100) + + let amountOfSpacesAlwaysCorrectTemplate func expected = + let cde = new CountdownEvent(200) + let addingTasks = Seq.init 200 (fun _ -> async { + func |> ignore + cde.Signal() |> ignore }) + addingTasks + |> Async.Parallel + |> Async.RunSynchronously + |> ignore + cde.Wait() + testParking.GetCarsAmount() |> should equal expected + + amountOfSpacesAlwaysCorrectTemplate testParking.CheckAndAdd 100 + + amountOfSpacesAlwaysCorrectTemplate testParking.CheckAndDelete 0 diff --git a/addtask/task2/task2.tests/task2.tests.fsproj b/addtask/task2/task2.tests/task2.tests.fsproj new file mode 100644 index 0000000..1c6fa24 --- /dev/null +++ b/addtask/task2/task2.tests/task2.tests.fsproj @@ -0,0 +1,28 @@ + + + + net6.0 + + false + true + true + + + + + + + + + + + + + + + + + + + + diff --git a/addtask/task2/task2/Program.fs b/addtask/task2/task2/Program.fs new file mode 100644 index 0000000..d27827e --- /dev/null +++ b/addtask/task2/task2/Program.fs @@ -0,0 +1,37 @@ +module ParkingSimulation + +open System.Threading +open System + +type Parking(size: int) = + let mutable parkedCars = 0 + + member _.GetCarsAmount() = parkedCars + + member _.CheckAndAdd() = + let mutable answer = false + let mutable isDone = false + while not isDone do + let current = parkedCars + if current = size then + isDone <- true + else + let incremented = current + 1 + if Interlocked.CompareExchange(&parkedCars, incremented, current) = current then + isDone <- true + answer <- true + answer + + member _.CheckAndDelete(): Boolean = + let mutable answer = false + let mutable isDone = false + while not isDone do + let current = parkedCars + if current = 0 then + isDone <- true + else + let decremented = current - 1 + if Interlocked.CompareExchange(&parkedCars, decremented, current) = current then + isDone <- true + answer <- true + answer diff --git a/addtask/task2/task2/task2.fsproj b/addtask/task2/task2/task2.fsproj new file mode 100644 index 0000000..dd5c71e --- /dev/null +++ b/addtask/task2/task2/task2.fsproj @@ -0,0 +1,12 @@ + + + + Exe + net6.0 + + + + + + +