Skip to content

Commit 0442f04

Browse files
author
Chris Myers
committed
Merge branch 'master' into answers
Conflicts: src/main/scala/com/rea/typesafety/ValidationExercises.scala
2 parents a561d64 + acc6b63 commit 0442f04

File tree

2 files changed

+47
-35
lines changed

2 files changed

+47
-35
lines changed

src/main/scala/com/rea/typesafety/ValidationExercises.scala

Lines changed: 3 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,7 @@ import scalaz._, Scalaz._
55
object ValidationExercises {
66
type VE[+A] = ValidationNel[ErrorCode, A]
77

8-
val allBad = Map[String, String]()
9-
val goodInput = Map("firstName" -> "Vladimir", "lastName" -> "Putin", "password" -> "crimea14")
10-
val passwordIsTooShort = goodInput + ("password" -> "crim3a")
11-
val passwordNoNumbers = goodInput + ("password" -> "crimeaasd")
12-
val passwordNoNumbersAndTooShort = goodInput + ("password" -> "crime")
13-
val noFirstName = goodInput - "firstName"
14-
val noLastName = goodInput - "lastName"
15-
16-
def validateKey(input: Map[String, String], key: String): ValidationNel[ErrorCode, String] =
17-
input.get(key).toSuccess(keyNotFound(key)).toValidationNel
8+
def validateKey(key: String, input: Map[String, String]): ValidationNel[ErrorCode, String] = ???
189

1910
def nameValidation(name: String, label: String): ValidationNel[ErrorCode, String] =
2011
if (!name.isEmpty) name.successNel else nameIsEmpty(label).failNel
@@ -25,32 +16,9 @@ object ValidationExercises {
2516
def passwordLengthValidation(password: String): ValidationNel[ErrorCode, String] =
2617
if (password.length >= 8) password.successNel else passwordTooShort.failNel
2718

28-
def validateInput(input: Map[String, String]): ValidationNel[ErrorCode, Person] = {
29-
val vKey = validateKey(input, _: String)
30-
def vName(name: String) = vKey(name).flatMap(nameValidation(_, name))
31-
32-
val firstName = vName("firstName")
33-
val lastName = vName("lastName")
34-
35-
36-
val password = vKey("password").flatMap(
37-
password => passwordLengthValidation(password) <* passwordStrengthValidation(password)
38-
)
39-
40-
Apply[VE].apply3(firstName, lastName, password)(Person)
41-
42-
}
43-
44-
def main(args: Array[String]) {
45-
println("Good input = " + validateInput(goodInput))
46-
println("All Bad input =" + validateInput(allBad))
47-
println("password too short = " + validateInput(passwordIsTooShort))
48-
println("password too weak = " + validateInput(passwordNoNumbers))
49-
println("password too short and too weak = " + validateInput(passwordNoNumbersAndTooShort))
50-
println("no first name = " + validateInput(noFirstName))
51-
println("no last name = " + validateInput(noLastName))
52-
}
19+
def validateInput(input: Map[String, String]): ValidationNel[ErrorCode, Person] = ???
5320

21+
5422

5523
}
5624

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.rea.typesafety
2+
3+
import org.specs2.mutable.Specification
4+
import ValidationExercises._
5+
import scalaz.{Failure, Success}
6+
7+
class ValidationExercisesSpec extends Specification {
8+
9+
val allBad = Map[String, String]()
10+
val goodInput = Map("firstName" -> "Vladimir", "lastName" -> "Putin", "password" -> "crimea14")
11+
val passwordIsTooShort = goodInput + ("password" -> "crim3a")
12+
val passwordNoNumbers = goodInput + ("password" -> "crimeaasd")
13+
val passwordNoNumbersAndTooShort = goodInput + ("password" -> "crime")
14+
val noFirstName = goodInput - "firstName"
15+
val noLastName = goodInput - "lastName"
16+
17+
18+
"Good input" in {
19+
validateInput(goodInput) === Success(Person("Vladimir", "Putin", "crimea14"))
20+
}
21+
22+
"All Bad input" in {
23+
validateInput(allBad) === Failure(List())
24+
}
25+
26+
"password too short" in {
27+
validateInput(passwordIsTooShort) === Failure(List())
28+
}
29+
30+
"password too weak" in {
31+
validateInput(passwordNoNumbers)
32+
}
33+
"password too short and too weak" in {
34+
validateInput(passwordNoNumbersAndTooShort)
35+
}
36+
"no first name" in {
37+
validateInput(noFirstName)
38+
}
39+
"no last name" in {
40+
validateInput(noLastName)
41+
}
42+
43+
44+
}

0 commit comments

Comments
 (0)