/
BasicChecks.fs
64 lines (52 loc) · 1.67 KB
/
BasicChecks.fs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
module BasicChecks
open Xunit
open FsCheck
open FsCheck.Xunit
type Positive =
static member Int() =
Arb.Default.Int32()
|> Arb.mapFilter abs (fun t -> t > 0)
type PositiveFloat =
static member Float() =
Arb.Default.Float()
|> Arb.mapFilter abs (fun t -> t > 0.0)
type SvgProperty() =
inherit PropertyAttribute(Arbitrary = [| typeof<PositiveFloat> |])
let isTagEnclosed (tag:string) =
let trimmedTag = tag.Trim()
trimmedTag.[0..0] = "<" && trimmedTag.[(trimmedTag.Length - 2)..(trimmedTag.Length - 1)] = "/>"
let happensEvenly chr (str:string) =
str.ToCharArray()
|> Array.fold (fun acc c -> if chr = c then acc + 1 else acc) 0
|> (fun x -> x % 2 = 0)
let isDepthNoMoreThanOne left right (str:string) =
str.ToCharArray()
|> Array.scan
(fun acc c ->
match c with
| c when c = left -> acc + 1
| c when c = right -> acc - 1
| _ -> acc
) 0
|> Array.max
|> (>=) 1
let isMatched left right (str:string) =
str.ToCharArray()
|> Array.fold
(fun acc c ->
match c with
| c when c = left -> acc + 1
| c when c = right -> acc - 1
| _ -> acc
) 0 = 0
let checkBodylessTag name tag =
Assert.True(isMatched '<' '>' tag)
Assert.True(isDepthNoMoreThanOne '<' '>' tag)
Assert.True(happensEvenly '"' tag)
Assert.True(happensEvenly ''' tag)
Assert.True(isTagEnclosed tag)
let checkTag name tag =
Assert.True(isMatched '<' '>' tag)
Assert.True(isDepthNoMoreThanOne '<' '>' tag)
Assert.True(happensEvenly '"' tag)
Assert.True(happensEvenly ''' tag)