desc: Tests r.default
tests:

    # The test driver sometimes rewrites `null` to `None` in Ruby for unknown reasons.

    # tst
    - cd: r.expr(1).default(2)
      ot: 1
    - cd: r.expr(null).default(2)
      ot: 2
    - cd: r.expr({})['b'].default(2)
      js: r.expr({})('b').default(2)
      ot: 2
    - cd: r.expr(r.expr('a')['b']).default(2)
      js: r.expr(r.expr('a')('b')).default(2)
      ot: err("RqlRuntimeError", "Cannot perform get_field on a non-object non-sequence `\"a\"`.", [])
    - rb: r.expr([]).reduce{|a,b| a+b}.default(2)
      py: r.expr([]).reduce(lambda a,b:a+b).default(2)
      js: r.expr([]).reduce(function(a,b){return a+b}).default(2)
      ot: 2
    - rb: r.expr([]).union([]).reduce{|a,b| a+b}.default(2)
      py: r.expr([]).union([]).reduce(lambda a,b:a+b).default(2)
      js: r.expr([]).union([]).reduce(function(a,b){return a+b}).default(2)
      ot: 2
    - rb: r.expr('a').reduce{|a,b| a+b}.default(2)
      py: r.expr('a').reduce(lambda a,b:a+b).default(2)
      js: r.expr('a').reduce(function(a,b){return a+b}).default(2)
      ot: err("RqlRuntimeError", "Cannot convert STRING to SEQUENCE", [])
    - cd: (r.expr(null) + 5).default(2)
      js: (r.expr(null).add(5)).default(2)
      ot: 2
    - cd: (5 + r.expr(null)).default(2)
      js: (r.expr(5).add(null)).default(2)
      ot: 2
    - cd: (5 - r.expr(null)).default(2)
      js: (r.expr(5).sub(null)).default(2)
      ot: 2
    - cd: (r.expr(null) - 5).default(2)
      js: (r.expr(null).sub(5)).default(2)
      ot: 2
    - cd: (r.expr('a') + 5).default(2)
      js: (r.expr('a').add(5)).default(2)
      ot: err("RqlRuntimeError", "Expected type STRING but found NUMBER.", [])
    - cd: (5 + r.expr('a')).default(2)
      js: (r.expr(5).add('a')).default(2)
      ot: err("RqlRuntimeError", "Expected type NUMBER but found STRING.", [])
    - cd: (r.expr('a') - 5).default(2)
      js: (r.expr('a').sub(5)).default(2)
      ot: err("RqlRuntimeError", "Expected type NUMBER but found STRING.", [])
    - cd: (5 - r.expr('a')).default(2)
      js: (r.expr(5).sub('a')).default(2)
      ot: err("RqlRuntimeError", "Expected type NUMBER but found STRING.", [])

    - cd: r.expr(1).default(r.error())
      ot: 1
    - cd: r.expr(null).default(r.error())
      ot: (null)
    - cd: r.expr({})['b'].default(r.error())
      js: r.expr({})('b').default(r.error())
      ot: err("RqlRuntimeError", "No attribute `b` in object.", [])
    - rb: r.expr([]).reduce{|a,b| a+b}.default(r.error)
      py: r.expr([]).reduce(lambda a,b:a+b).default(r.error)
      js: r.expr([]).reduce(function(a,b){return a+b}).default(r.error)
      ot: err("RqlRuntimeError", "Cannot reduce over an empty stream with no base.", [])
    - rb: r.expr([]).union([]).reduce{|a,b| a+b}.default(r.error)
      py: r.expr([]).union([]).reduce(lambda a,b:a+b).default(r.error)
      js: r.expr([]).union([]).reduce(function(a,b){return a+b}).default(r.error)
      ot: err("RqlRuntimeError", "Cannot reduce over an empty stream with no base.", [])
    - cd: (r.expr(null) + 5).default(r.error)
      js: (r.expr(null).add(5)).default(r.error)
      ot: err("RqlRuntimeError", "Expected type NUMBER but found NULL.", [])
    - cd: (5 + r.expr(null)).default(r.error)
      js: (r.expr(5).add(null)).default(r.error)
      ot: err("RqlRuntimeError", "Expected type NUMBER but found NULL.", [])
    - cd: (5 - r.expr(null)).default(r.error)
      js: (r.expr(5).sub(null)).default(r.error)
      ot: err("RqlRuntimeError", "Expected type NUMBER but found NULL.", [])
    - cd: (r.expr(null) - 5).default(r.error)
      js: (r.expr(null).sub(5)).default(r.error)
      ot: err("RqlRuntimeError", "Expected type NUMBER but found NULL.", [])

    - rb: r.expr(1).default{|e| e}
      py: r.expr(1).default(lambda e:e)
      js: r.expr(1).default(function(e){return e})
      ot: 1
    - cd: r.expr(null).default{|e| e}
      py: r.expr(null).default(lambda e:e)
      js: r.expr(null).default(function(e){return e})
      ot: (null)
    - cd: r.expr({})['b'].default{|e| e}
      py: r.expr({})['b'].default(lambda e:e)
      js: r.expr({})('b').default(function(e){return e})
      ot: ("No attribute `b` in object:\n{\n}")
    - cd: r.expr([]).reduce{|a,b| a+b}.default{|e| e}
      py: r.expr([]).reduce(lambda a,b:a+b).default(lambda e:e)
      js: r.expr([]).reduce(function(a,b){return a+b}).default(function(e){return e})
      ot: ("Cannot reduce over an empty stream with no base.")
    - cd: r.expr([]).union([]).reduce{|a,b| a+b}.default{|e| e}
      py: r.expr([]).union([]).reduce(lambda a,b:a+b).default(lambda e:e)
      js: r.expr([]).union([]).reduce(function(a,b){return a+b}).default(function(e){return e})
      ot: ("Cannot reduce over an empty stream with no base.")
    - cd: (r.expr(null) + 5).default{|e| e}
      py: (r.expr(null) + 5).default(lambda e:e)
      js: (r.expr(null).add(5)).default(function(e){return e})
      ot: ("Expected type NUMBER but found NULL.")
    - cd: (5 + r.expr(null)).default{|e| e}
      py: (5 + r.expr(null)).default(lambda e:e)
      js: (r.expr(5).add(null)).default(function(e){return e})
      ot: ("Expected type NUMBER but found NULL.")
    - cd: (5 - r.expr(null)).default{|e| e}
      py: (5 - r.expr(null)).default(lambda e:e)
      js: (r.expr(5).sub(null)).default(function(e){return e})
      ot: ("Expected type NUMBER but found NULL.")
    - cd: (r.expr(null) - 5).default{|e| e}
      py: (r.expr(null) - 5).default(lambda e:e)
      js: (r.expr(null).sub(5)).default(function(e){return e})
      ot: ("Expected type NUMBER but found NULL.")

    - def: arr = r.expr([{'a':1},{'a':null},{}]).order_by('a')

    - cd: arr.filter{|x| x['a'].eq(1)}
      py: arr.filter(lambda x:x['a'].eq(1))
      js: arr.filter(function(x){return x('a').eq(1)})
      ot: [{'a':1}]
    - cd: arr.filter(:default => false){|x| x['a'].eq(1)}
      py: arr.filter(lambda x:x['a'].eq(1), default=False)
      js: arr.filter(function(x){return x('a').eq(1)}, {'default':false})
      ot: [{'a':1}]
    - cd: arr.filter(:default => true){|x| x['a'].eq(1)}
      py: arr.filter(lambda x:x['a'].eq(1), default=True)
      js: arr.filter(function(x){return x('a').eq(1)}, {'default':true})
      ot: [{}, {'a':1}] # `null` compares not equal to 1 with no error
    - cd: arr.filter(:default => r.js('true')){|x| x['a'].eq(1)}
      py: arr.filter(lambda x:x['a'].eq(1), default=r.js('true'))
      js: arr.filter(function(x) { return x('a').eq(1) }, { 'default':r.js('true') })
      ot: [{}, {'a':1}]
    - cd: arr.filter(:default => r.js('false')){|x| x['a'].eq(1)}
      py: arr.filter(lambda x:x['a'].eq(1), default=r.js('false'))
      js: arr.filter(function(x) { return x('a').eq(1) }, { 'default':r.js('false') })
      ot: [{'a':1}]
    - cd: arr.filter(:default => r.error){|x| x['a'].eq(1)}
      py: arr.filter(lambda x:x['a'].eq(1), default=r.error())
      js: arr.filter(function(x){return x('a').eq(1)}, {'default':r.error()})
      ot: err("RqlRuntimeError", "No attribute `a` in object.", [])

    - cd: r.expr(false).do{|d| arr.filter(:default => d){|x| x['a'].eq(1)}}
      py: r.expr(False).do(lambda d:arr.filter(lambda x:x['a'].eq(1), default=d))
      js: r.expr(false).do(function(d){return arr.filter(function(x){return x('a').eq(1)}, {default:d})})
      ot: [{'a':1}]
    - cd: r.expr(true).do{|d| arr.filter(:default => d){|x| x['a'].eq(1)}}.orderby('a')
      py: r.expr(True).do(lambda d:arr.filter(lambda x:x['a'].eq(1), default=d)).order_by('a')
      js: r.expr(true).do(function(d){return arr.filter(function(x){return x('a').eq(1)}, {default:d})}).orderBy('a')
      ot: [{}, {'a':1}] # `null` compares not equal to 1 with no error

    - cd: arr.filter{|x| x['a'].default(0).eq(1)}
      py: arr.filter(lambda x:x['a'].default(0).eq(1))
      js: arr.filter(function(x){return x('a').default(0).eq(1)})
      ot: [{'a':1}]
    - cd: arr.filter{|x| x['a'].default(1).eq(1)}.orderby('a')
      py: arr.filter(lambda x:x['a'].default(1).eq(1)).order_by('a')
      js: arr.filter(function(x){return x('a').default(1).eq(1)}).orderBy('a')
      ot: ([{}, {'a':null}, {'a':1}])
    - cd: arr.filter{|x| x['a'].default(r.error).eq(1)}
      py: arr.filter(lambda x:x['a'].default(r.error()).eq(1))
      js: arr.filter(function(x){return x('a').default(r.error()).eq(1)})
      ot: [{'a':1}] # gets caught by `filter` default

    - cd: r.expr(0).do{|i| arr.filter{|x| x['a'].default(i).eq(1)}}
      py: r.expr(0).do(lambda i:arr.filter(lambda x:x['a'].default(i).eq(1)))
      js: r.expr(0).do(function(i){return arr.filter(function(x){return x('a').default(i).eq(1)})})
      ot: [{'a':1}]
    - cd: r.expr(1).do{|i| arr.filter{|x| x['a'].default(i).eq(1)}}.orderby('a')
      py: r.expr(1).do(lambda i:arr.filter(lambda x:x['a'].default(i).eq(1))).order_by('a')
      js: r.expr(1).do(function(i){return arr.filter(function(x){return x('a').default(i).eq(1)})}).orderBy('a')
      ot: ([{},{'a':null},{'a':1}])

    - cd: arr.filter{|x| x['a'].eq(1).or(x['a']['b'].eq(2))}
      py: arr.filter(lambda x:r.any(x['a'].eq(1), x['a']['b'].eq(2)))
      js: arr.filter(function(x){return x('a').eq(1).or(x('a')('b').eq(2))})
      ot: [{'a':1}]
    - cd: arr.filter(:default => false){|x| x['a'].eq(1).or(x['a']['b'].eq(2))}
      py: arr.filter(lambda x:r.any(x['a'].eq(1), x['a']['b'].eq(2)), default=False)
      js: arr.filter(function(x){return x('a').eq(1).or(x('a')('b').eq(2))}, {default:false})
      ot: [{'a':1}]
    - cd: arr.filter(:default => true){|x| x['a'].eq(1).or(x['a']['b'].eq(2))}.orderby('a')
      py: arr.filter(lambda x:r.any(x['a'].eq(1), x['a']['b'].eq(2)), default=True).order_by('a')
      js: arr.filter(function(x){return x('a').eq(1).or(x('a')('b').eq(2))}, {default:true}).orderBy('a')
      ot: ([{}, {'a':null}, {'a':1}])
    - cd: arr.filter(:default => r.error){|x| x['a'].eq(1).or(x['a']['b'].eq(2))}
      py: arr.filter(lambda x:r.any(x['a'].eq(1), x['a']['b'].eq(2)), default=r.error())
      js: arr.filter(function(x){return x('a').eq(1).or(x('a')('b').eq(2))}, {default:r.error()})
      ot: err("RqlRuntimeError", "No attribute `a` in object.", [])

    - cd: r.table_create('default_test')
      ot: ({'created':1})

    - cd: r.table('default_test').insert(arr)
      ot: ({'deleted':0.0,'replaced':0.0,'generated_keys':arrlen(3,uuid()),'unchanged':0.0,'errors':0.0,'skipped':0.0,'inserted':3})

    - def: tbl = r.table('default_test').order_by('a').pluck('a')

    - cd: tbl.filter{|x| x['a'].eq(1)}
      py: tbl.filter(lambda x:x['a'].eq(1))
      js: tbl.filter(function(x){return x('a').eq(1)})
      ot: [{'a':1}]
    - cd: tbl.filter(:default => false){|x| x['a'].eq(1)}
      py: tbl.filter(lambda x:x['a'].eq(1), default=False)
      js: tbl.filter(function(x){return x('a').eq(1)}, {'default':false})
      ot: [{'a':1}]
    - cd: tbl.filter(:default => true){|x| x['a'].eq(1)}
      py: tbl.filter(lambda x:x['a'].eq(1), default=True)
      js: tbl.filter(function(x){return x('a').eq(1)}, {'default':true})
      ot: [{}, {'a':1}] # `null` compares not equal to 1 with no error
    - cd: tbl.filter(:default => r.error){|x| x['a'].eq(1)}
      py: tbl.filter(lambda x:x['a'].eq(1), default=r.error())
      js: tbl.filter(function(x){return x('a').eq(1)}, {'default':r.error()})
      ot: err("RqlRuntimeError", "No attribute `a` in object.", [])

    - cd: r.expr(false).do{|d| tbl.filter(:default => d){|x| x['a'].eq(1)}}
      py: r.expr(False).do(lambda d:tbl.filter(lambda x:x['a'].eq(1), default=d))
      js: r.expr(false).do(function(d){return tbl.filter(function(x){return x('a').eq(1)}, {default:d})})
      ot: [{'a':1}]
    - cd: r.expr(true).do{|d| tbl.filter(:default => d){|x| x['a'].eq(1)}}.orderby('a')
      py: r.expr(True).do(lambda d:tbl.filter(lambda x:x['a'].eq(1), default=d)).order_by('a')
      js: r.expr(true).do(function(d){return tbl.filter(function(x){return x('a').eq(1)}, {default:d})}).orderBy('a')
      ot: [{}, {'a':1}] # `null` compares not equal to 1 with no error

    - cd: tbl.filter{|x| x['a'].default(0).eq(1)}
      py: tbl.filter(lambda x:x['a'].default(0).eq(1))
      js: tbl.filter(function(x){return x('a').default(0).eq(1)})
      ot: [{'a':1}]
    - cd: tbl.filter{|x| x['a'].default(1).eq(1)}.orderby('a')
      py: tbl.filter(lambda x:x['a'].default(1).eq(1)).order_by('a')
      js: tbl.filter(function(x){return x('a').default(1).eq(1)}).orderBy('a')
      ot: ([{}, {'a':null}, {'a':1}])
    - cd: tbl.filter{|x| x['a'].default(r.error).eq(1)}
      py: tbl.filter(lambda x:x['a'].default(r.error()).eq(1))
      js: tbl.filter(function(x){return x('a').default(r.error()).eq(1)})
      ot: [{'a':1}] # gets caught by `filter` default

    - cd: r.expr(0).do{|i| tbl.filter{|x| x['a'].default(i).eq(1)}}
      py: r.expr(0).do(lambda i:tbl.filter(lambda x:x['a'].default(i).eq(1)))
      js: r.expr(0).do(function(i){return tbl.filter(function(x){return x('a').default(i).eq(1)})})
      ot: [{'a':1}]
    - cd: r.expr(1).do{|i| tbl.filter{|x| x['a'].default(i).eq(1)}}.orderby('a')
      py: r.expr(1).do(lambda i:tbl.filter(lambda x:x['a'].default(i).eq(1))).order_by('a')
      js: r.expr(1).do(function(i){return tbl.filter(function(x){return x('a').default(i).eq(1)})}).orderBy('a')
      ot: ([{},{'a':null},{'a':1}])

    - cd: tbl.filter{|x| x['a'].eq(1).or(x['a']['b'].eq(2))}
      py: tbl.filter(lambda x:r.any(x['a'].eq(1), x['a']['b'].eq(2)))
      js: tbl.filter(function(x){return x('a').eq(1).or(x('a')('b').eq(2))})
      ot: [{'a':1}]
    - cd: tbl.filter(:default => false){|x| x['a'].eq(1).or(x['a']['b'].eq(2))}
      py: tbl.filter(lambda x:r.any(x['a'].eq(1), x['a']['b'].eq(2)), default=False)
      js: tbl.filter(function(x){return x('a').eq(1).or(x('a')('b').eq(2))}, {default:false})
      ot: [{'a':1}]
    - cd: tbl.filter(:default => true){|x| x['a'].eq(1).or(x['a']['b'].eq(2))}.orderby('a')
      py: tbl.filter(lambda x:r.any(x['a'].eq(1), x['a']['b'].eq(2)), default=True).order_by('a')
      js: tbl.filter(function(x){return x('a').eq(1).or(x('a')('b').eq(2))}, {default:true}).orderBy('a')
      ot: ([{}, {'a':null}, {'a':1}])
    - cd: tbl.filter(:default => r.error){|x| x['a'].eq(1).or(x['a']['b'].eq(2))}
      py: tbl.filter(lambda x:r.any(x['a'].eq(1), x['a']['b'].eq(2)), default=r.error())
      js: tbl.filter(function(x){return x('a').eq(1).or(x('a')('b').eq(2))}, {default:r.error()})
      ot: err("RqlRuntimeError", "No attribute `a` in object.", [])

    - cd: r.table_drop('default_test')
      ot: ({'dropped':1})
