forked from ngrunwald/datasplash
/
assert.clj
105 lines (86 loc) · 2.8 KB
/
assert.clj
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
(ns datasplash.testing.assert
"Namespace to expose `PAssert` based matchers to test pipelines.
Because `PAssert` is made to be used with JUnit, assertions will only raise `AssertionError`."
(:require
[datasplash.core :as ds])
(:import
(datasplash.testing PredicateMatcher)
(org.apache.beam.sdk.testing PAssert
PAssert$IterableAssert
PAssert$SingletonAssert)
(org.apache.beam.sdk.transforms SerializableFunction)
(org.hamcrest MatcherAssert)))
(set! *warn-on-reflection* true)
(defn as-iterable
"Returns an `IterableAssert` for a given PCollection."
^PAssert$IterableAssert
[pcoll]
(PAssert/that pcoll))
(defn as-singleton-iterable
"Returns an `IterableAssert` for a given PCollection.
The provided PCollection must use an `IterableCoder` and have one element."
^PAssert$IterableAssert
[pcoll]
(PAssert/thatSingletonIterable pcoll))
(defn as-flattened
"Returns an `IterableAssert` for a flattened PCollectionList."
^PAssert$IterableAssert
[pcoll-list]
(PAssert/thatFlattened pcoll-list))
(defn as-singleton
"Returns a `SingletonAssert` for a given **one element** PCollection."
^PAssert$SingletonAssert
[pcoll]
(PAssert/thatSingleton pcoll))
(defn as-map
"Returns a `SingletonAssert` for a given KV PCollection coerce as a map."
^PAssert$SingletonAssert
[kv-pcoll]
(PAssert/thatMap kv-pcoll))
(defn as-multimap
"Returns a `SingletonAssert` for a given KV PCollection coerce as a multimap."
^PAssert$SingletonAssert
[kv-pcoll]
(PAssert/thatMultimap kv-pcoll))
(defprotocol AssertContainsOnly
(contains-only
[this expected]
"Asserts element only contains expected **in any order**."))
(defprotocol AssertIsEmpty
(is-empty [this]
"Asserts element is empty."))
(defprotocol AssertEquals
(equals-to [this expected]
"Asserts element is equal to expected."))
(defprotocol AssertNotEquals
(not-equals-to [this expected]
"Asserts element is not equal to expected value."))
(defprotocol AssertSatisfies
(satisfies [this pred]
"Asserts element against a predicate function."))
(defn- satisfies-sfn
^SerializableFunction
[pred]
(ds/sfn
(fn [v]
(MatcherAssert/assertThat v (PredicateMatcher/satisfies pred)))))
(extend-type PAssert$IterableAssert
AssertContainsOnly
(contains-only [this ^Iterable expected]
(.containsInAnyOrder this expected))
AssertIsEmpty
(is-empty [this]
(.empty this))
AssertSatisfies
(satisfies [this pred]
(.satisfies this (satisfies-sfn pred))))
(extend-type PAssert$SingletonAssert
AssertEquals
(equals-to [this expected]
(.isEqualTo this expected))
AssertNotEquals
(not-equals-to [this expected]
(.notEqualTo this expected))
AssertSatisfies
(satisfies [this pred]
(.satisfies this (satisfies-sfn pred))))