factbase 0.8.0 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -1
- data/Gemfile +1 -1
- data/Gemfile.lock +13 -13
- data/README.md +24 -24
- data/REUSE.toml +7 -2
- data/Rakefile +8 -1
- data/benchmark/bench_factbase.rb +1 -1
- data/fixtures/stories/agg.yml +17 -0
- data/fixtures/stories/always.yml +16 -0
- data/fixtures/stories/as.yml +16 -0
- data/fixtures/stories/count.yml +18 -0
- data/fixtures/stories/eq.yml +30 -0
- data/fixtures/stories/gt.yml +18 -0
- data/fixtures/stories/join.yml +19 -0
- data/fixtures/stories/max.yml +14 -0
- data/fixtures/stories/min.yml +14 -0
- data/fixtures/stories/nth.yml +14 -0
- data/fixtures/stories/or.yml +18 -0
- data/fixtures/stories/sprintf.yml +12 -0
- data/fixtures/stories/sum.yml +14 -0
- data/lib/factbase/cached/cached_fact.rb +28 -0
- data/lib/factbase/cached/cached_factbase.rb +64 -0
- data/lib/factbase/cached/cached_query.rb +61 -0
- data/lib/factbase/cached/cached_term.rb +25 -0
- data/lib/factbase/fact.rb +13 -13
- data/lib/factbase/indexed/indexed_fact.rb +28 -0
- data/lib/factbase/indexed/indexed_factbase.rb +64 -0
- data/lib/factbase/indexed/indexed_query.rb +56 -0
- data/lib/factbase/indexed/indexed_term.rb +60 -0
- data/lib/factbase/inv.rb +18 -6
- data/lib/factbase/light.rb +7 -6
- data/lib/factbase/logged.rb +87 -62
- data/lib/factbase/query.rb +29 -34
- data/lib/factbase/rules.rb +16 -15
- data/lib/factbase/sync/sync_factbase.rb +57 -0
- data/lib/factbase/sync/sync_query.rb +61 -0
- data/lib/factbase/syntax.rb +12 -25
- data/lib/factbase/tallied.rb +11 -10
- data/lib/factbase/taped.rb +8 -0
- data/lib/factbase/tee.rb +2 -0
- data/lib/factbase/term.rb +45 -17
- data/lib/factbase/terms/aggregates.rb +17 -15
- data/lib/factbase/terms/aliases.rb +4 -4
- data/lib/factbase/terms/casting.rb +8 -8
- data/lib/factbase/terms/debug.rb +2 -2
- data/lib/factbase/terms/defn.rb +3 -3
- data/lib/factbase/terms/logical.rb +53 -14
- data/lib/factbase/terms/math.rb +26 -26
- data/lib/factbase/terms/meta.rb +14 -14
- data/lib/factbase/terms/ordering.rb +4 -4
- data/lib/factbase/terms/strings.rb +8 -8
- data/lib/factbase/terms/system.rb +3 -3
- data/lib/factbase.rb +67 -55
- data/test/factbase/cached/test_cached_factbase.rb +22 -0
- data/test/factbase/cached/test_cached_query.rb +79 -0
- data/test/factbase/indexed/test_indexed_query.rb +175 -0
- data/test/factbase/sync/test_sync_query.rb +30 -0
- data/test/factbase/terms/test_aggregates.rb +5 -5
- data/test/factbase/terms/test_aliases.rb +7 -7
- data/test/factbase/terms/test_casting.rb +8 -8
- data/test/factbase/terms/test_debug.rb +6 -6
- data/test/factbase/terms/test_defn.rb +14 -14
- data/test/factbase/terms/test_logical.rb +17 -19
- data/test/factbase/terms/test_math.rb +63 -61
- data/test/factbase/terms/test_meta.rb +36 -36
- data/test/factbase/terms/test_ordering.rb +9 -9
- data/test/factbase/terms/test_strings.rb +10 -10
- data/test/factbase/terms/test_system.rb +6 -6
- data/test/factbase/test_accum.rb +5 -5
- data/test/factbase/test_fact.rb +12 -12
- data/test/factbase/test_logged.rb +7 -0
- data/test/factbase/test_query.rb +110 -37
- data/test/factbase/test_rules.rb +1 -1
- data/test/factbase/test_syntax.rb +12 -12
- data/test/factbase/test_tee.rb +8 -8
- data/test/factbase/test_term.rb +39 -30
- data/test/test__helper.rb +2 -2
- data/test/test_factbase.rb +6 -0
- metadata +29 -4
- data/lib/factbase/query_once.rb +0 -54
- data/lib/factbase/term_once.rb +0 -67
@@ -12,109 +12,111 @@ require_relative '../../../lib/factbase/term'
|
|
12
12
|
# License:: MIT
|
13
13
|
class TestMath < Factbase::Test
|
14
14
|
def test_simple
|
15
|
-
t = Factbase::Term.new(
|
16
|
-
assert(t.evaluate(fact('foo' => [42]), []))
|
17
|
-
refute(t.evaluate(fact('foo' => 'Hello!'), []))
|
18
|
-
refute(t.evaluate(fact('bar' => ['Hello!']), []))
|
15
|
+
t = Factbase::Term.new(:eq, [:foo, 42])
|
16
|
+
assert(t.evaluate(fact('foo' => [42]), [], Factbase.new))
|
17
|
+
refute(t.evaluate(fact('foo' => 'Hello!'), [], Factbase.new))
|
18
|
+
refute(t.evaluate(fact('bar' => ['Hello!']), [], Factbase.new))
|
19
19
|
end
|
20
20
|
|
21
21
|
def test_zero
|
22
|
-
t = Factbase::Term.new(
|
23
|
-
assert(t.evaluate(fact('foo' => [0]), []))
|
24
|
-
assert(t.evaluate(fact('foo' => [10, 5, 6, -8, 'hey', 0, 9, 'fdsf']), []))
|
25
|
-
refute(t.evaluate(fact('foo' => [100]), []))
|
26
|
-
refute(t.evaluate(fact('foo' => []), []))
|
27
|
-
refute(t.evaluate(fact('bar' => []), []))
|
22
|
+
t = Factbase::Term.new(:zero, [:foo])
|
23
|
+
assert(t.evaluate(fact('foo' => [0]), [], Factbase.new))
|
24
|
+
assert(t.evaluate(fact('foo' => [10, 5, 6, -8, 'hey', 0, 9, 'fdsf']), [], Factbase.new))
|
25
|
+
refute(t.evaluate(fact('foo' => [100]), [], Factbase.new))
|
26
|
+
refute(t.evaluate(fact('foo' => []), [], Factbase.new))
|
27
|
+
refute(t.evaluate(fact('bar' => []), [], Factbase.new))
|
28
28
|
end
|
29
29
|
|
30
30
|
def test_eq
|
31
|
-
t = Factbase::Term.new(
|
32
|
-
assert(t.evaluate(fact('foo' => 42), []))
|
33
|
-
assert(t.evaluate(fact('foo' => [10, 5, 6, -8, 'hey', 42, 9, 'fdsf']), []))
|
34
|
-
refute(t.evaluate(fact('foo' => [100]), []))
|
35
|
-
refute(t.evaluate(fact('foo' => []), []))
|
36
|
-
refute(t.evaluate(fact('bar' => []), []))
|
31
|
+
t = Factbase::Term.new(:eq, [:foo, 42])
|
32
|
+
assert(t.evaluate(fact('foo' => 42), [], Factbase.new))
|
33
|
+
assert(t.evaluate(fact('foo' => [10, 5, 6, -8, 'hey', 42, 9, 'fdsf']), [], Factbase.new))
|
34
|
+
refute(t.evaluate(fact('foo' => [100]), [], Factbase.new))
|
35
|
+
refute(t.evaluate(fact('foo' => []), [], Factbase.new))
|
36
|
+
refute(t.evaluate(fact('bar' => []), [], Factbase.new))
|
37
37
|
end
|
38
38
|
|
39
39
|
def test_eq_time
|
40
40
|
now = Time.now
|
41
|
-
t = Factbase::Term.new(
|
42
|
-
assert(t.evaluate(fact('foo' => now), []))
|
43
|
-
assert(t.evaluate(fact('foo' => [now, Time.now]), []))
|
41
|
+
t = Factbase::Term.new(:eq, [:foo, Time.parse(now.iso8601)])
|
42
|
+
assert(t.evaluate(fact('foo' => now), [], Factbase.new))
|
43
|
+
assert(t.evaluate(fact('foo' => [now, Time.now]), [], Factbase.new))
|
44
44
|
end
|
45
45
|
|
46
46
|
def test_lt
|
47
|
-
t = Factbase::Term.new(
|
48
|
-
assert(t.evaluate(fact('foo' => [10]), []))
|
49
|
-
refute(t.evaluate(fact('foo' => [100]), []))
|
50
|
-
refute(t.evaluate(fact('foo' => 100), []))
|
51
|
-
refute(t.evaluate(fact('bar' => 100), []))
|
47
|
+
t = Factbase::Term.new(:lt, [:foo, 42])
|
48
|
+
assert(t.evaluate(fact('foo' => [10]), [], Factbase.new))
|
49
|
+
refute(t.evaluate(fact('foo' => [100]), [], Factbase.new))
|
50
|
+
refute(t.evaluate(fact('foo' => 100), [], Factbase.new))
|
51
|
+
refute(t.evaluate(fact('bar' => 100), [], Factbase.new))
|
52
52
|
end
|
53
53
|
|
54
54
|
def test_gte
|
55
|
-
t = Factbase::Term.new(
|
56
|
-
assert(t.evaluate(fact('foo' => 100), []))
|
57
|
-
assert(t.evaluate(fact('foo' => 42), []))
|
58
|
-
refute(t.evaluate(fact('foo' => 41), []))
|
55
|
+
t = Factbase::Term.new(:gte, [:foo, 42])
|
56
|
+
assert(t.evaluate(fact('foo' => 100), [], Factbase.new))
|
57
|
+
assert(t.evaluate(fact('foo' => 42), [], Factbase.new))
|
58
|
+
refute(t.evaluate(fact('foo' => 41), [], Factbase.new))
|
59
59
|
end
|
60
60
|
|
61
61
|
def test_lte
|
62
|
-
t = Factbase::Term.new(
|
63
|
-
assert(t.evaluate(fact('foo' => 41), []))
|
64
|
-
assert(t.evaluate(fact('foo' => 42), []))
|
65
|
-
refute(t.evaluate(fact('foo' => 100), []))
|
62
|
+
t = Factbase::Term.new(:lte, [:foo, 42])
|
63
|
+
assert(t.evaluate(fact('foo' => 41), [], Factbase.new))
|
64
|
+
assert(t.evaluate(fact('foo' => 42), [], Factbase.new))
|
65
|
+
refute(t.evaluate(fact('foo' => 100), [], Factbase.new))
|
66
66
|
end
|
67
67
|
|
68
68
|
def test_gt
|
69
|
-
t = Factbase::Term.new(
|
70
|
-
assert(t.evaluate(fact('foo' => [100]), []))
|
71
|
-
assert(t.evaluate(fact('foo' => 100), []))
|
72
|
-
refute(t.evaluate(fact('foo' => [10]), []))
|
73
|
-
refute(t.evaluate(fact('foo' => 10), []))
|
74
|
-
refute(t.evaluate(fact('bar' => 10), []))
|
69
|
+
t = Factbase::Term.new(:gt, [:foo, 42])
|
70
|
+
assert(t.evaluate(fact('foo' => [100]), [], Factbase.new))
|
71
|
+
assert(t.evaluate(fact('foo' => 100), [], Factbase.new))
|
72
|
+
refute(t.evaluate(fact('foo' => [10]), [], Factbase.new))
|
73
|
+
refute(t.evaluate(fact('foo' => 10), [], Factbase.new))
|
74
|
+
refute(t.evaluate(fact('bar' => 10), [], Factbase.new))
|
75
75
|
end
|
76
76
|
|
77
77
|
def test_lt_time
|
78
|
-
t = Factbase::Term.new(
|
79
|
-
assert(t.evaluate(fact('foo' => [Time.now - 100]), []))
|
80
|
-
refute(t.evaluate(fact('foo' => [Time.now + 100]), []))
|
81
|
-
refute(t.evaluate(fact('bar' => [100]), []))
|
78
|
+
t = Factbase::Term.new(:lt, [:foo, Time.now])
|
79
|
+
assert(t.evaluate(fact('foo' => [Time.now - 100]), [], Factbase.new))
|
80
|
+
refute(t.evaluate(fact('foo' => [Time.now + 100]), [], Factbase.new))
|
81
|
+
refute(t.evaluate(fact('bar' => [100]), [], Factbase.new))
|
82
82
|
end
|
83
83
|
|
84
84
|
def test_gt_time
|
85
|
-
t = Factbase::Term.new(
|
86
|
-
assert(t.evaluate(fact('foo' => [Time.now + 100]), []))
|
87
|
-
refute(t.evaluate(fact('foo' => [Time.now - 100]), []))
|
88
|
-
refute(t.evaluate(fact('bar' => [100]), []))
|
85
|
+
t = Factbase::Term.new(:gt, [:foo, Time.now])
|
86
|
+
assert(t.evaluate(fact('foo' => [Time.now + 100]), [], Factbase.new))
|
87
|
+
refute(t.evaluate(fact('foo' => [Time.now - 100]), [], Factbase.new))
|
88
|
+
refute(t.evaluate(fact('bar' => [100]), [], Factbase.new))
|
89
89
|
end
|
90
90
|
|
91
91
|
def test_plus
|
92
|
-
t = Factbase::Term.new(
|
93
|
-
assert_equal(46, t.evaluate(fact('foo' => 4), []))
|
94
|
-
assert_nil(t.evaluate(fact, []))
|
92
|
+
t = Factbase::Term.new(:plus, [:foo, 42])
|
93
|
+
assert_equal(46, t.evaluate(fact('foo' => 4), [], Factbase.new))
|
94
|
+
assert_nil(t.evaluate(fact, [], Factbase.new))
|
95
95
|
end
|
96
96
|
|
97
97
|
def test_plus_time
|
98
|
-
t = Factbase::Term.new(
|
99
|
-
assert_equal(Time.parse('2024-01-13'), t.evaluate(fact('foo' => Time.parse('2024-01-01')), []))
|
100
|
-
assert_nil(t.evaluate(fact, []))
|
98
|
+
t = Factbase::Term.new(:plus, [:foo, '12 days'])
|
99
|
+
assert_equal(Time.parse('2024-01-13'), t.evaluate(fact('foo' => Time.parse('2024-01-01')), [], Factbase.new))
|
100
|
+
assert_nil(t.evaluate(fact, [], Factbase.new))
|
101
101
|
end
|
102
102
|
|
103
103
|
def test_minus
|
104
|
-
t = Factbase::Term.new(
|
105
|
-
assert_equal(58, t.evaluate(fact('foo' => 100), []))
|
106
|
-
assert_nil(t.evaluate(fact, []))
|
104
|
+
t = Factbase::Term.new(:minus, [:foo, 42])
|
105
|
+
assert_equal(58, t.evaluate(fact('foo' => 100), [], Factbase.new))
|
106
|
+
assert_nil(t.evaluate(fact, [], Factbase.new))
|
107
107
|
end
|
108
108
|
|
109
109
|
def test_minus_time
|
110
|
-
t = Factbase::Term.new(
|
111
|
-
assert_equal(Time.parse('2024-01-01T06:04'),
|
112
|
-
|
110
|
+
t = Factbase::Term.new(:minus, [:foo, '4 hours'])
|
111
|
+
assert_equal(Time.parse('2024-01-01T06:04'),
|
112
|
+
t.evaluate(fact('foo' => Time.parse('2024-01-01T10:04')), [], Factbase.new))
|
113
|
+
assert_nil(t.evaluate(fact, [], Factbase.new))
|
113
114
|
end
|
114
115
|
|
115
116
|
def test_minus_time_singular
|
116
|
-
t = Factbase::Term.new(
|
117
|
-
assert_equal(Time.parse('2024-01-01T09:04'),
|
118
|
-
|
117
|
+
t = Factbase::Term.new(:minus, [:foo, '1 hour'])
|
118
|
+
assert_equal(Time.parse('2024-01-01T09:04'),
|
119
|
+
t.evaluate(fact('foo' => Time.parse('2024-01-01T10:04')), [], Factbase.new))
|
120
|
+
assert_nil(t.evaluate(fact, [], Factbase.new))
|
119
121
|
end
|
120
122
|
end
|
@@ -12,59 +12,59 @@ require_relative '../../../lib/factbase/term'
|
|
12
12
|
# License:: MIT
|
13
13
|
class TestMeta < Factbase::Test
|
14
14
|
def test_exists
|
15
|
-
t = Factbase::Term.new(
|
16
|
-
assert(t.evaluate(fact('foo' => 41), []))
|
17
|
-
refute(t.evaluate(fact('bar' => 41), []))
|
15
|
+
t = Factbase::Term.new(:exists, [:foo])
|
16
|
+
assert(t.evaluate(fact('foo' => 41), [], Factbase.new))
|
17
|
+
refute(t.evaluate(fact('bar' => 41), [], Factbase.new))
|
18
18
|
end
|
19
19
|
|
20
20
|
def test_absent
|
21
|
-
t = Factbase::Term.new(
|
22
|
-
refute(t.evaluate(fact('foo' => 41), []))
|
23
|
-
assert(t.evaluate(fact('bar' => 41), []))
|
21
|
+
t = Factbase::Term.new(:absent, [:foo])
|
22
|
+
refute(t.evaluate(fact('foo' => 41), [], Factbase.new))
|
23
|
+
assert(t.evaluate(fact('bar' => 41), [], Factbase.new))
|
24
24
|
end
|
25
25
|
|
26
26
|
def test_size
|
27
|
-
t = Factbase::Term.new(
|
28
|
-
assert_equal(1, t.evaluate(fact('foo' => 41), []))
|
29
|
-
assert_equal(0, t.evaluate(fact('foo' => nil), []))
|
30
|
-
assert_equal(4, t.evaluate(fact('foo' => [1, 2, 3, 4]), []))
|
31
|
-
assert_equal(0, t.evaluate(fact('foo' => []), []))
|
32
|
-
assert_equal(1, t.evaluate(fact('foo' => ''), []))
|
27
|
+
t = Factbase::Term.new(:size, [:foo])
|
28
|
+
assert_equal(1, t.evaluate(fact('foo' => 41), [], Factbase.new))
|
29
|
+
assert_equal(0, t.evaluate(fact('foo' => nil), [], Factbase.new))
|
30
|
+
assert_equal(4, t.evaluate(fact('foo' => [1, 2, 3, 4]), [], Factbase.new))
|
31
|
+
assert_equal(0, t.evaluate(fact('foo' => []), [], Factbase.new))
|
32
|
+
assert_equal(1, t.evaluate(fact('foo' => ''), [], Factbase.new))
|
33
33
|
end
|
34
34
|
|
35
35
|
def test_type
|
36
|
-
t = Factbase::Term.new(
|
37
|
-
assert_equal('nil', t.evaluate(fact('foo' => nil), []))
|
38
|
-
assert_equal('Integer', t.evaluate(fact('foo' => [1]), []))
|
39
|
-
assert_equal('Array', t.evaluate(fact('foo' => [1, 2]), []))
|
40
|
-
assert_equal('String', t.evaluate(fact('foo' => 'bar'), []))
|
41
|
-
assert_equal('Float', t.evaluate(fact('foo' => 2.1), []))
|
42
|
-
assert_equal('Time', t.evaluate(fact('foo' => Time.now), []))
|
36
|
+
t = Factbase::Term.new(:type, [:foo])
|
37
|
+
assert_equal('nil', t.evaluate(fact('foo' => nil), [], Factbase.new))
|
38
|
+
assert_equal('Integer', t.evaluate(fact('foo' => [1]), [], Factbase.new))
|
39
|
+
assert_equal('Array', t.evaluate(fact('foo' => [1, 2]), [], Factbase.new))
|
40
|
+
assert_equal('String', t.evaluate(fact('foo' => 'bar'), [], Factbase.new))
|
41
|
+
assert_equal('Float', t.evaluate(fact('foo' => 2.1), [], Factbase.new))
|
42
|
+
assert_equal('Time', t.evaluate(fact('foo' => Time.now), [], Factbase.new))
|
43
43
|
end
|
44
44
|
|
45
45
|
def test_nil
|
46
|
-
t = Factbase::Term.new(
|
47
|
-
assert(t.evaluate(fact('foo' => nil), []))
|
48
|
-
refute(t.evaluate(fact('foo' => true), []))
|
49
|
-
refute(t.evaluate(fact('foo' => 'bar'), []))
|
46
|
+
t = Factbase::Term.new(:nil, [:foo])
|
47
|
+
assert(t.evaluate(fact('foo' => nil), [], Factbase.new))
|
48
|
+
refute(t.evaluate(fact('foo' => true), [], Factbase.new))
|
49
|
+
refute(t.evaluate(fact('foo' => 'bar'), [], Factbase.new))
|
50
50
|
end
|
51
51
|
|
52
52
|
def test_many
|
53
|
-
t = Factbase::Term.new(
|
54
|
-
refute(t.evaluate(fact('foo' => nil), []))
|
55
|
-
refute(t.evaluate(fact('foo' => 1), []))
|
56
|
-
refute(t.evaluate(fact('foo' => '1234'), []))
|
57
|
-
assert(t.evaluate(fact('foo' => [1, 3, 5]), []))
|
58
|
-
refute(t.evaluate(fact('foo' => []), []))
|
53
|
+
t = Factbase::Term.new(:many, [:foo])
|
54
|
+
refute(t.evaluate(fact('foo' => nil), [], Factbase.new))
|
55
|
+
refute(t.evaluate(fact('foo' => 1), [], Factbase.new))
|
56
|
+
refute(t.evaluate(fact('foo' => '1234'), [], Factbase.new))
|
57
|
+
assert(t.evaluate(fact('foo' => [1, 3, 5]), [], Factbase.new))
|
58
|
+
refute(t.evaluate(fact('foo' => []), [], Factbase.new))
|
59
59
|
end
|
60
60
|
|
61
61
|
def test_one
|
62
|
-
t = Factbase::Term.new(
|
63
|
-
assert(t.evaluate(fact('foo' => 1), []))
|
64
|
-
assert(t.evaluate(fact('foo' => '1234'), []))
|
65
|
-
assert(t.evaluate(fact('foo' => [1]), []))
|
66
|
-
refute(t.evaluate(fact('foo' => nil), []))
|
67
|
-
refute(t.evaluate(fact('foo' => [1, 3, 5]), []))
|
68
|
-
refute(t.evaluate(fact('foo' => []), []))
|
62
|
+
t = Factbase::Term.new(:one, [:foo])
|
63
|
+
assert(t.evaluate(fact('foo' => 1), [], Factbase.new))
|
64
|
+
assert(t.evaluate(fact('foo' => '1234'), [], Factbase.new))
|
65
|
+
assert(t.evaluate(fact('foo' => [1]), [], Factbase.new))
|
66
|
+
refute(t.evaluate(fact('foo' => nil), [], Factbase.new))
|
67
|
+
refute(t.evaluate(fact('foo' => [1, 3, 5]), [], Factbase.new))
|
68
|
+
refute(t.evaluate(fact('foo' => []), [], Factbase.new))
|
69
69
|
end
|
70
70
|
end
|
@@ -12,17 +12,17 @@ require_relative '../../../lib/factbase/term'
|
|
12
12
|
# License:: MIT
|
13
13
|
class TestOrdering < Factbase::Test
|
14
14
|
def test_prev
|
15
|
-
t = Factbase::Term.new(
|
16
|
-
assert_nil(t.evaluate(fact('foo' => 41), []))
|
17
|
-
assert_equal([41], t.evaluate(fact('foo' => 5), []))
|
18
|
-
assert_equal([5], t.evaluate(fact('foo' => 6), []))
|
15
|
+
t = Factbase::Term.new(:prev, [:foo])
|
16
|
+
assert_nil(t.evaluate(fact('foo' => 41), [], Factbase.new))
|
17
|
+
assert_equal([41], t.evaluate(fact('foo' => 5), [], Factbase.new))
|
18
|
+
assert_equal([5], t.evaluate(fact('foo' => 6), [], Factbase.new))
|
19
19
|
end
|
20
20
|
|
21
21
|
def test_unique
|
22
|
-
t = Factbase::Term.new(
|
23
|
-
refute(t.evaluate(fact, []))
|
24
|
-
assert(t.evaluate(fact('foo' => 41), []))
|
25
|
-
refute(t.evaluate(fact('foo' => 41), []))
|
26
|
-
assert(t.evaluate(fact('foo' => 1), []))
|
22
|
+
t = Factbase::Term.new(:unique, [:foo])
|
23
|
+
refute(t.evaluate(fact, [], Factbase.new))
|
24
|
+
assert(t.evaluate(fact('foo' => 41), [], Factbase.new))
|
25
|
+
refute(t.evaluate(fact('foo' => 41), [], Factbase.new))
|
26
|
+
assert(t.evaluate(fact('foo' => 1), [], Factbase.new))
|
27
27
|
end
|
28
28
|
end
|
@@ -12,25 +12,25 @@ require_relative '../../../lib/factbase/term'
|
|
12
12
|
# License:: MIT
|
13
13
|
class TestStrings < Factbase::Test
|
14
14
|
def test_regexp_matching
|
15
|
-
t = Factbase::Term.new(
|
16
|
-
assert(t.evaluate(fact('foo' => 'hello'), []))
|
17
|
-
assert(t.evaluate(fact('foo' => 'hello 42'), []))
|
18
|
-
refute(t.evaluate(fact('foo' => 42), []))
|
15
|
+
t = Factbase::Term.new(:matches, [:foo, '[a-z]+'])
|
16
|
+
assert(t.evaluate(fact('foo' => 'hello'), [], Factbase.new))
|
17
|
+
assert(t.evaluate(fact('foo' => 'hello 42'), [], Factbase.new))
|
18
|
+
refute(t.evaluate(fact('foo' => 42), [], Factbase.new))
|
19
19
|
end
|
20
20
|
|
21
21
|
def test_concat
|
22
|
-
t = Factbase::Term.new(
|
23
|
-
s = t.evaluate(fact, [])
|
22
|
+
t = Factbase::Term.new(:concat, [42, 'hi', 3.14, :hey, Time.now])
|
23
|
+
s = t.evaluate(fact, [], Factbase.new)
|
24
24
|
assert(s.start_with?('42hi3.14'))
|
25
25
|
end
|
26
26
|
|
27
27
|
def test_concat_empty
|
28
|
-
t = Factbase::Term.new(
|
29
|
-
assert_equal('', t.evaluate(fact, []))
|
28
|
+
t = Factbase::Term.new(:concat, [])
|
29
|
+
assert_equal('', t.evaluate(fact, [], Factbase.new))
|
30
30
|
end
|
31
31
|
|
32
32
|
def test_sprintf
|
33
|
-
t = Factbase::Term.new(
|
34
|
-
assert_equal('hi, Jeff!', t.evaluate(fact, []))
|
33
|
+
t = Factbase::Term.new(:sprintf, ['hi, %s!', 'Jeff'])
|
34
|
+
assert_equal('hi, Jeff!', t.evaluate(fact, [], Factbase.new))
|
35
35
|
end
|
36
36
|
end
|
@@ -13,19 +13,19 @@ require_relative '../../../lib/factbase/term'
|
|
13
13
|
class TestSystem < Factbase::Test
|
14
14
|
def test_env
|
15
15
|
ENV.store('FOO', 'bar')
|
16
|
-
t = Factbase::Term.new(
|
17
|
-
assert_equal('bar', t.evaluate(fact, []))
|
16
|
+
t = Factbase::Term.new(:env, ['FOO', ''])
|
17
|
+
assert_equal('bar', t.evaluate(fact, [], Factbase.new))
|
18
18
|
end
|
19
19
|
|
20
20
|
def test_default
|
21
21
|
ENV.delete('FOO')
|
22
|
-
t = Factbase::Term.new(
|
23
|
-
assert_equal('мой друг', t.evaluate(fact, []))
|
22
|
+
t = Factbase::Term.new(:env, ['FOO', 'мой друг'])
|
23
|
+
assert_equal('мой друг', t.evaluate(fact, [], Factbase.new))
|
24
24
|
end
|
25
25
|
|
26
26
|
def test_when_default_is_absent
|
27
27
|
ENV.delete('FOO')
|
28
|
-
t = Factbase::Term.new(
|
29
|
-
assert_raises(StandardError) { t.evaluate(fact, []) }
|
28
|
+
t = Factbase::Term.new(:env, ['FOO'])
|
29
|
+
assert_raises(StandardError) { t.evaluate(fact, [], Factbase.new) }
|
30
30
|
end
|
31
31
|
end
|
data/test/factbase/test_accum.rb
CHANGED
@@ -15,7 +15,7 @@ require_relative '../../lib/factbase/fact'
|
|
15
15
|
class TestAccum < Factbase::Test
|
16
16
|
def test_holds_props
|
17
17
|
map = {}
|
18
|
-
f = Factbase::Fact.new(
|
18
|
+
f = Factbase::Fact.new(map)
|
19
19
|
props = {}
|
20
20
|
a = Factbase::Accum.new(f, props, false)
|
21
21
|
a.foo = 42
|
@@ -26,7 +26,7 @@ class TestAccum < Factbase::Test
|
|
26
26
|
|
27
27
|
def test_passes_props
|
28
28
|
map = {}
|
29
|
-
f = Factbase::Fact.new(
|
29
|
+
f = Factbase::Fact.new(map)
|
30
30
|
props = {}
|
31
31
|
a = Factbase::Accum.new(f, props, true)
|
32
32
|
a.foo = 42
|
@@ -37,7 +37,7 @@ class TestAccum < Factbase::Test
|
|
37
37
|
|
38
38
|
def test_appends_props
|
39
39
|
map = {}
|
40
|
-
f = Factbase::Fact.new(
|
40
|
+
f = Factbase::Fact.new(map)
|
41
41
|
f.foo = 42
|
42
42
|
props = {}
|
43
43
|
a = Factbase::Accum.new(f, props, false)
|
@@ -46,14 +46,14 @@ class TestAccum < Factbase::Test
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def test_empties
|
49
|
-
f = Factbase::Fact.new(
|
49
|
+
f = Factbase::Fact.new({})
|
50
50
|
a = Factbase::Accum.new(f, {}, false)
|
51
51
|
assert_nil(a['foo'])
|
52
52
|
end
|
53
53
|
|
54
54
|
def test_prints_to_string
|
55
55
|
map = {}
|
56
|
-
f = Factbase::Fact.new(
|
56
|
+
f = Factbase::Fact.new(map)
|
57
57
|
props = {}
|
58
58
|
a = Factbase::Accum.new(f, props, true)
|
59
59
|
a.foo = 42
|
data/test/factbase/test_fact.rb
CHANGED
@@ -14,7 +14,7 @@ require_relative '../../lib/factbase/fact'
|
|
14
14
|
class TestFact < Factbase::Test
|
15
15
|
def test_injects_data_correctly
|
16
16
|
map = {}
|
17
|
-
f = Factbase::Fact.new(
|
17
|
+
f = Factbase::Fact.new(map)
|
18
18
|
f.foo = 1
|
19
19
|
f.bar = 2
|
20
20
|
f.bar = 3
|
@@ -25,7 +25,7 @@ class TestFact < Factbase::Test
|
|
25
25
|
|
26
26
|
def test_simple_resetting
|
27
27
|
map = {}
|
28
|
-
f = Factbase::Fact.new(
|
28
|
+
f = Factbase::Fact.new(map)
|
29
29
|
f.foo = 42
|
30
30
|
assert_equal(42, f.foo, f.to_s)
|
31
31
|
f.foo = 256
|
@@ -35,7 +35,7 @@ class TestFact < Factbase::Test
|
|
35
35
|
|
36
36
|
def test_keeps_values_unique
|
37
37
|
map = {}
|
38
|
-
f = Factbase::Fact.new(
|
38
|
+
f = Factbase::Fact.new(map)
|
39
39
|
f.foo = 42
|
40
40
|
f.foo = 'Hello'
|
41
41
|
assert_equal(2, map['foo'].size)
|
@@ -44,28 +44,28 @@ class TestFact < Factbase::Test
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def test_fails_when_empty
|
47
|
-
f = Factbase::Fact.new(
|
47
|
+
f = Factbase::Fact.new({})
|
48
48
|
assert_raises(StandardError) do
|
49
49
|
f.something
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
53
|
def test_fails_when_setting_nil
|
54
|
-
f = Factbase::Fact.new(
|
54
|
+
f = Factbase::Fact.new({})
|
55
55
|
assert_raises(StandardError) do
|
56
56
|
f.foo = nil
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
60
|
def test_fails_when_setting_empty
|
61
|
-
f = Factbase::Fact.new(
|
61
|
+
f = Factbase::Fact.new({})
|
62
62
|
assert_raises(StandardError) do
|
63
63
|
f.foo = ''
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
67
|
def test_fails_when_not_found
|
68
|
-
f = Factbase::Fact.new(
|
68
|
+
f = Factbase::Fact.new({})
|
69
69
|
f.first = 42
|
70
70
|
assert_raises(StandardError) do
|
71
71
|
f.second
|
@@ -73,21 +73,21 @@ class TestFact < Factbase::Test
|
|
73
73
|
end
|
74
74
|
|
75
75
|
def test_set_by_name
|
76
|
-
f = Factbase::Fact.new(
|
76
|
+
f = Factbase::Fact.new({})
|
77
77
|
f.send(:_foo_bar=, 42)
|
78
78
|
assert_equal(42, f._foo_bar, f.to_s)
|
79
79
|
end
|
80
80
|
|
81
81
|
def test_set_twice_same_value
|
82
82
|
map = {}
|
83
|
-
f = Factbase::Fact.new(
|
83
|
+
f = Factbase::Fact.new(map)
|
84
84
|
f.foo = 42
|
85
85
|
f.foo = 42
|
86
86
|
assert_equal([42], map['foo'])
|
87
87
|
end
|
88
88
|
|
89
89
|
def test_time_in_utc
|
90
|
-
f = Factbase::Fact.new(
|
90
|
+
f = Factbase::Fact.new({})
|
91
91
|
t = Time.now
|
92
92
|
f.foo = t
|
93
93
|
assert_equal(t.utc, f.foo)
|
@@ -95,13 +95,13 @@ class TestFact < Factbase::Test
|
|
95
95
|
end
|
96
96
|
|
97
97
|
def test_some_names_are_prohibited
|
98
|
-
f = Factbase::Fact.new(
|
98
|
+
f = Factbase::Fact.new({})
|
99
99
|
assert_raises(StandardError) { f.to_s = 42 }
|
100
100
|
assert_raises(StandardError) { f.class = 42 }
|
101
101
|
end
|
102
102
|
|
103
103
|
def test_get_all_properties
|
104
|
-
f = Factbase::Fact.new(
|
104
|
+
f = Factbase::Fact.new({})
|
105
105
|
f.foo = 42
|
106
106
|
assert_includes(f.all_properties, 'foo')
|
107
107
|
end
|
@@ -48,6 +48,13 @@ class TestLogged < Factbase::Test
|
|
48
48
|
assert_includes(log.to_s, 'touched', log)
|
49
49
|
end
|
50
50
|
|
51
|
+
def test_with_slow_txn
|
52
|
+
log = Loog::Buffer.new
|
53
|
+
fb = Factbase::Logged.new(Factbase.new, log, time_tolerate: 0.1)
|
54
|
+
fb.txn { sleep 0.4 }
|
55
|
+
assert_includes(log.to_s, '(slow!)', log)
|
56
|
+
end
|
57
|
+
|
51
58
|
def test_with_txn_rollback
|
52
59
|
log = Loog::Buffer.new
|
53
60
|
fb = Factbase::Logged.new(Factbase.new, log)
|