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