Skip to content

Commit b1e301f

Browse files
committed
JS: Define expression.add(…) to build new expression
1 parent 9f5a28e commit b1e301f

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

lib/expression.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,12 @@ export class Expression {
5151
matches (schema) {
5252
return this.validate(schema).valid
5353
}
54+
55+
add (expression) {
56+
if (this.schema.maxItems) {
57+
return Expression.build({ All: [this, expression] })
58+
} else {
59+
return this.clone({ args: [...this.args, expression] })
60+
}
61+
}
5462
}

test/expression.test.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,21 @@ describe('Expression', () => {
8585
expect(expression.validate().valid).toBe(false)
8686
})
8787
})
88+
89+
describe('add', () => {
90+
test('Any returns new expression with added arg', () => {
91+
const expression = Expression.build({ Any: [] }).add(true)
92+
expect(expression.value).toEqual({ Any: [true] })
93+
})
94+
95+
test('Max returns new expression with added arg', () => {
96+
const expression = Expression.build({ Max: [1] }).add(2)
97+
expect(expression.value).toEqual({ Max: [1, 2] })
98+
})
99+
100+
test('Equal returns new expression wrapped in All', () => {
101+
const expression = Expression.build({ Equal: [1, 1] }).add(false)
102+
expect(expression.value).toEqual({ All: [{ Equal: [1, 1] }, false] })
103+
})
104+
})
88105
})

0 commit comments

Comments
 (0)