2017-11-02 07:05:11 -07:00

170 lines
4.9 KiB
YAML

desc: These tests are aimed at &&, ||, and !
tests:
## basic operator usage
# Python overloads '&' for 'and'
- py:
- r.expr(true) & true
- true & r.expr(true)
- r.and_(true,true)
- r.expr(true).and_(true)
rb:
- r(true) & true
- r(true) & r(true)
- r.and(true,true)
- r(true).and(true)
js:
- r.and(true,true)
- r(true).and(true)
ot: true
- py:
- r.expr(true) & false
- r.expr(false) & false
- true & r.expr(false)
- false & r.expr(false)
- r.and_(true,false)
- r.and_(false,false)
- r.expr(true).and_(false)
- r.expr(false).and_(false)
rb:
- r(true) & false
- r(false) & false
- r(true) & r(false)
- r(false) & r(false)
- r.and(true,false)
- r.and(false,false)
- r(true).and(false)
- r(false).and(false)
js:
- r.and(true,false)
- r.and(false,false)
- r(true).and(false)
- r(false).and(false)
ot: false
# Python overloads '|' for 'or'
- py:
- r.expr(true) | true
- r.expr(true) | false
- true | r.expr(true)
- true | r.expr(false)
- r.or_(true,true)
- r.or_(true,false)
- r.expr(true).or_(true)
- r.expr(true).or_(false)
rb:
- r(true) | true
- r(true) | false
- r(true) | r(true)
- r(true) | r(false)
- r.or(true,true)
- r.or(true,false)
- r(true).or(true)
- r(true).or(false)
js:
- r.or(true,true)
- r.or(true,false)
- r(true).or(true)
- r(true).or(false)
ot: true
- py:
- r.expr(false) | false
- false | r.expr(false)
- r.and_(false,false)
- r.expr(false).and_(false)
rb:
- r(false) | false
- r(false) | r(false)
- r.and(false,false)
- r(false).and(false)
js:
- r.and(false,false)
- r(false).and(false)
ot: false
# Python overloads '~' for 'not'
- py:
- ~r.expr(True)
- r.not_(True)
cd: r(true).not()
ot: false
- py:
- ~r.expr(False)
- r.not_(False)
cd: r(false).not()
ot: true
- py: r.expr(True).not_()
cd: r(true).not()
ot: false
- py: r.expr(False).not_()
cd: r(false).not()
ot: true
## DeMorgan's rules!
- py:
- ~r.and_(True, True) == r.or_(~r.expr(True), ~r.expr(True))
- ~r.and_(True, False) == r.or_(~r.expr(True), ~r.expr(False))
- ~r.and_(False, False) == r.or_(~r.expr(False), ~r.expr(False))
- ~r.and_(False, True) == r.or_(~r.expr(False), ~r.expr(True))
cd:
- r(true).and(true).not().eq(r(true).not().or(r(true).not()))
- r(true).and(false).not().eq(r(true).not().or(r(false).not()))
- r(false).and(false).not().eq(r(false).not().or(r(false).not()))
- r(false).and(true).not().eq(r(false).not().or(r(true).not()))
ot: true
# Test multiple arguments to 'and' and 'or'
- cd: r(true).and(true, true, true, true)
py: r.and_(True, True, True, True, True)
ot: true
- cd: r(true).and(true, true, false, true)
py: r.and_(True, True, True, False, True)
ot: false
- cd: r(true).and(false, true, false, true)
py: r.and_(True, False, True, False, True)
ot: false
- cd: r(false).or(false, false, false, false)
py: r.or_(False, False, False, False, False)
ot: false
- cd: r(false).or(false, false, true, false)
py: r.or_(False, False, False, True, False)
ot: true
- cd: r(false).or(true, false, true, false)
py: r.or_(False, True, False, True, False)
ot: true
# Test that precedence errors are detected
- js: r.expr(r.expr('a')('b')).default(2)
py: r.expr(r.expr('a')['b']).default(2)
rb: r(r('a')['b']).default(2)
ot: err("ReqlQueryLogicError", "Cannot perform bracket on a non-object non-sequence `\"a\"`.", [])
- py: r.expr(r.expr(True) & r.expr(False) == r.expr(False) | r.expr(True))
ot: err("ReqlDriverCompileError", "Calling '==' on result of infix bitwise operator:", [])
- py: r.expr(r.and_(True, False) == r.or_(False, True))
ot: False
- rb: r.expr(r.expr(True) & r.expr(False) >= r.expr(False) | r.expr(True))
py: r.expr(r.expr(True) & r.expr(False) >= r.expr(False) | r.expr(True))
ot: err("ReqlDriverCompileError", "Calling '>=' on result of infix bitwise operator:", [])
- cd: r.expr(r.and(True, False) >= r.or(False, True))
py: r.expr(r.and_(True, False) >= r.or_(False, True))
ot: False
# Type errors
- py: r.expr(1) & True
cd: r(1).and(true)
ot: true
- py: r.expr(False) | 'str'
cd: r(false).or('str')
ot: ("str")
- py: ~r.expr(1)
cd: r(1).not()
ot: false
- py: ~r.expr(null)
cd: r(null).not()
ot: true