Skip to content

Commit

Permalink
Fix exercism#286 - Linked List: change pop and shift to return option
Browse files Browse the repository at this point in the history
  • Loading branch information
balazsbotond committed Jan 22, 2017
1 parent f6f8c31 commit 9da0115
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 23 deletions.
8 changes: 4 additions & 4 deletions exercises/linked-list/Example.fs
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,19 @@ let addToEmpty newValue linkedList =

let pop linkedList =
match linkedList.last with
| None -> failwith "Cannot pop from empty list"
| None -> None
| Some oldLast ->
linkedList.last <- oldLast.prev
linkedList.last |> Option.iter (fun el -> el.next <- None)
oldLast.value
Some oldLast.value

let shift linkedList =
match linkedList.first with
| None -> failwith "Cannot shift from empty list"
| None -> None
| Some oldFirst ->
linkedList.first <- oldFirst.next
linkedList.first |> Option.iter (fun el -> el.prev <- None)
oldFirst.value
Some oldFirst.value

let push newValue linkedList =
match linkedList.last with
Expand Down
53 changes: 34 additions & 19 deletions exercises/linked-list/LinkedListTest.fs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@ open NUnit.Framework
open LinkedList

[<Test>]
let ``Pop returns None if the list is empty`` () =
let linkedList = mkLinkedList ()
let value = pop linkedList

Assert.That(value, Is.EqualTo(None))

[<Test>]
[<Ignore("Remove to run test")>]
let ``Push and pop are first in last out order`` () =
let linkedList = mkLinkedList ()
linkedList |> push 10
Expand All @@ -12,8 +20,15 @@ let ``Push and pop are first in last out order`` () =
let val1 = pop linkedList
let val2 = pop linkedList

Assert.That(val1, Is.EqualTo(20))
Assert.That(val2, Is.EqualTo(10))
Assert.That(val1, Is.EqualTo(Some 20))
Assert.That(val2, Is.EqualTo(Some 10))

[<Test>]
let ``Shift returns None if the list is empty`` () =
let linkedList = mkLinkedList ()
let value = shift linkedList

Assert.That(value, Is.EqualTo(None))

[<Test>]
[<Ignore("Remove to run test")>]
Expand All @@ -25,8 +40,8 @@ let ``Push and shift are first in first out order`` () =
let val1 = shift linkedList
let val2 = shift linkedList

Assert.That(val1, Is.EqualTo(10))
Assert.That(val2, Is.EqualTo(20))
Assert.That(val1, Is.EqualTo(Some 10))
Assert.That(val2, Is.EqualTo(Some 20))

[<Test>]
[<Ignore("Remove to run test")>]
Expand All @@ -38,8 +53,8 @@ let ``Unshift and shift are last in first out order`` () =
let val1 = shift linkedList
let val2 = shift linkedList

Assert.That(val1, Is.EqualTo(20))
Assert.That(val2, Is.EqualTo(10))
Assert.That(val1, Is.EqualTo(Some 20))
Assert.That(val2, Is.EqualTo(Some 10))

[<Test>]
[<Ignore("Remove to run test")>]
Expand All @@ -51,8 +66,8 @@ let ``Unshift and pop are last in last out order`` () =
let val1 = pop linkedList
let val2 = pop linkedList

Assert.That(val1, Is.EqualTo(10))
Assert.That(val2, Is.EqualTo(20))
Assert.That(val1, Is.EqualTo(Some 10))
Assert.That(val2, Is.EqualTo(Some 20))

[<Test>]
[<Ignore("Remove to run test")>]
Expand All @@ -66,9 +81,9 @@ let ``Push and pop can handle multiple values`` () =
let val2 = pop linkedList
let val3 = pop linkedList

Assert.That(val1, Is.EqualTo(30))
Assert.That(val2, Is.EqualTo(20))
Assert.That(val3, Is.EqualTo(10))
Assert.That(val1, Is.EqualTo(Some 30))
Assert.That(val2, Is.EqualTo(Some 20))
Assert.That(val3, Is.EqualTo(Some 10))

[<Test>]
[<Ignore("Remove to run test")>]
Expand All @@ -82,9 +97,9 @@ let ``Unshift and shift can handle multiple values`` () =
let val2 = shift linkedList
let val3 = shift linkedList

Assert.That(val1, Is.EqualTo(30))
Assert.That(val2, Is.EqualTo(20))
Assert.That(val3, Is.EqualTo(10))
Assert.That(val1, Is.EqualTo(Some 30))
Assert.That(val2, Is.EqualTo(Some 20))
Assert.That(val3, Is.EqualTo(Some 10))

[<Test>]
[<Ignore("Remove to run test")>]
Expand All @@ -95,12 +110,12 @@ let ``All methods of manipulating the linkedList can be used together`` () =

let val1 = pop linkedList

Assert.That(val1, Is.EqualTo(20))
Assert.That(val1, Is.EqualTo(Some 20))

linkedList |> push 30
let val2 = shift linkedList

Assert.That(val2, Is.EqualTo(10))
Assert.That(val2, Is.EqualTo(Some 10))

linkedList |> unshift 40
linkedList |> push 50
Expand All @@ -109,6 +124,6 @@ let ``All methods of manipulating the linkedList can be used together`` () =
let val4 = pop linkedList
let val5 = shift linkedList

Assert.That(val3, Is.EqualTo(40))
Assert.That(val4, Is.EqualTo(50))
Assert.That(val5, Is.EqualTo(30))
Assert.That(val3, Is.EqualTo(Some 40))
Assert.That(val4, Is.EqualTo(Some 50))
Assert.That(val5, Is.EqualTo(Some 30))

0 comments on commit 9da0115

Please sign in to comment.