Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions Tasks/Test/Test.Tests/QueueTests.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
module Queue.Tests

open NUnit.Framework
open FsUnit
open System

[<Test>]
let testEnqueue_AddElements_SizeShouldBeCorrect () =
let queue = new Queue<int> ()
queue.Count |> should equal 0
for x in { 1 .. 100 } do
queue.Enqueue x
queue.Count |> should equal 100

[<Test>]
let testDequeue_AddEndGetElements_ObtainElementsInOrderOfAddition () =
let queue = new Queue<int> ()
queue.Enqueue -100
queue.Enqueue 42
queue.Enqueue 0
queue.Enqueue Int32.MaxValue
queue.Enqueue Int32.MinValue
queue.Dequeue () |> should equal -100
queue.Dequeue () |> should equal 42
queue.Dequeue () |> should equal 0
queue.Count |> should equal 2
queue.Dequeue () |> should equal Int32.MaxValue
queue.Dequeue () |> should equal Int32.MinValue
queue.Count |> should equal 0

[<Test>]
let testDequeue_GetFromEmptyQueue_ThrowException () =
let queue = new Queue<string> ()
(fun () -> queue.Dequeue () |> ignore) |> should throw typeof<InvalidOperationException>
queue.Count |> should equal 0

[<Test>]
let testDequeue_RemoveAllElementsAndGetFromEmpty_ThrowException () =
let queue = new Queue<float> ()
queue.Enqueue 10.0
queue.Enqueue 12.2
queue.Dequeue () |> should equal 10.0
queue.Dequeue () |> should equal 12.2
(fun () -> queue.Dequeue () |> ignore) |> should throw typeof<InvalidOperationException>
queue.Count |> should equal 0

[<Test>]
let testDequeue_RemoveElementsAndAddNewOnes_ElementsAreAdded () =
let queue = new Queue<string> ()
queue.Enqueue "trololo"
queue.Enqueue ""
queue.Dequeue () |> should equal "trololo"
queue.Dequeue () |> should equal ""
queue.Count |> should equal 0
queue.Enqueue "test"
queue.Enqueue "a"
queue.Count |> should equal 2
queue.Dequeue () |> should equal "test"
queue.Dequeue () |> should equal "a"
1 change: 1 addition & 0 deletions Tasks/Test/Test.Tests/Test.Tests.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
<ItemGroup>
<Compile Include="BinaryTreeTests.fs" />
<Compile Include="InfiniteSequenceTests.fs" />
<Compile Include="QueueTests.fs" />
<Compile Include="Program.fs" />
</ItemGroup>

Expand Down
50 changes: 50 additions & 0 deletions Tasks/Test/Test/Queue.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
namespace Queue

open System

/// Class representing an element in a linked list.
type Node<'a>(value: 'a, next: Node<'a> option) =
let mutable value = value
let mutable next = next

/// Get the value of the node.
member _.Value: 'a = value

/// Get the next node of the current one.
member _.Next: Node<'a> option = next

/// Set the next node of the current one.
member _.SetNext (node: Node<'a> option) = next <- node

/// Class representing a generic queue.
type Queue<'a>() =
let mutable head: Node<'a> option = None
let mutable tail: Node<'a> option = None
let mutable count = 0

/// Get the size of the queue.
member _.Count: int = count

/// Add the given `value` to the queue.
member _.Enqueue (value: 'a): unit =
let next = Node (value, None)
match tail with
| Some node ->
node.SetNext <| Some next
tail <- Some next
| None ->
head <- Some next
tail <- Some next
count <- count + 1

/// Remove the first element from the queue and return its value.
member _.Dequeue (): 'a =
match head with
| Some node ->
let res = node.Value
head <- node.Next
if head.IsNone then tail <- None
count <- count - 1
res
| None ->
raise (new InvalidOperationException "Error on dequeue: queue was empty")
1 change: 1 addition & 0 deletions Tasks/Test/Test/Test.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
<ItemGroup>
<Compile Include="BinaryTree.fs" />
<Compile Include="InfiniteSequence.fs" />
<Compile Include="Queue.fs" />
</ItemGroup>

</Project>