inquerest 0.2.0

A complex url parameter parser for rest filter queries
Documentation
extern crate inquerest;
extern crate nom;

use inquerest::*;
use nom::IResult;

#[test]
fn test_simple(){
    assert_eq!(
        IResult::Done("".as_bytes(), Filter{
                connector: None,
                condition: Condition{left:Operand::Column("student".to_owned()),
                                    equality:Equality::EQ,
                                    right: Operand::Boolean(true)
                            },
                sub_filters: vec![]
                }),
        filter("student=eq.true".as_bytes()))
}

#[test]
fn test_enclosed(){
    assert_eq!(
        IResult::Done("".as_bytes(), Filter{
                connector: None,
                condition: Condition{left:Operand::Column("student".to_owned()),
                                    equality:Equality::EQ,
                                    right: Operand::Boolean(true)
                            },
                sub_filters: vec![]
                }),
        filter("(student=eq.true)".as_bytes()))
}
#[test]
fn and_filter(){
    assert_eq!(
       IResult::Done("".as_bytes(), 
           Filter { 
               connector: None, 
               condition: Condition { 
                       left: Operand::Column("student".to_owned()), 
                       equality: Equality::EQ, 
                       right: Operand::Boolean(true) }, 
                       sub_filters: vec![
                               Filter { 
                                   connector: Some(Connector::AND), 
                                   condition: Condition { 
                                               left: Operand::Column("age".to_owned()), 
                                               equality: Equality::LT, 
                                               right: Operand::Number(13f64) 
                                           }, 
                                   sub_filters: vec![] 
                               }
                           ] 
           }
       ),
        filter("student=eq.true&age=lt.13".as_bytes()))
}

//#[test]
fn enclosed_and_filter(){
    assert_eq!(
       IResult::Done("".as_bytes(), 
           Filter { 
               connector: None, 
               condition: Condition { 
                       left: Operand::Column("student".to_owned()), 
                       equality: Equality::EQ, 
                       right: Operand::Boolean(true) }, 
                       sub_filters: vec![
                               Filter { 
                                   connector: Some(Connector::AND), 
                                   condition: Condition { 
                                               left: Operand::Column("age".to_owned()), 
                                               equality: Equality::LT, 
                                               right: Operand::Number(13f64) 
                                           }, 
                                   sub_filters: vec![] 
                               }
                           ] 
           }
       ),
        filter("(student=eq.true&age=lt.13)".as_bytes()))
}

//#[test]
fn enclosed_or_filter(){
    assert_eq!(
       IResult::Done("".as_bytes(), 
           Filter { 
               connector: None, 
               condition: Condition { 
                       left: Operand::Column("student".to_owned()), 
                       equality: Equality::EQ, 
                       right: Operand::Boolean(true) }, 
                       sub_filters: vec![
                               Filter { 
                                   connector: Some(Connector::OR), 
                                   condition: Condition { 
                                               left: Operand::Column("age".to_owned()), 
                                               equality: Equality::LT, 
                                               right: Operand::Number(13f64) 
                                           }, 
                                   sub_filters: vec![] 
                               }
                           ] 
           }
       ),
        filter("(student=eq.true|age=lt.13)".as_bytes()))
}

#[test]
#[should_panic] // FIXME: should not panic!
fn enclosed_or_filter2(){
    assert_eq!(
       IResult::Done("".as_bytes(), 
           Filter { 
               connector: None, 
               condition: Condition { 
                       left: Operand::Column("student".to_owned()), 
                       equality: Equality::EQ, 
                       right: Operand::Boolean(true) }, 
                       sub_filters: vec![
                               Filter { 
                                   connector: Some(Connector::OR), 
                                   condition: Condition { 
                                               left: Operand::Column("age".to_owned()), 
                                               equality: Equality::LT, 
                                               right: Operand::Number(13f64)
                                           }, 
                                   sub_filters: vec![] 
                               }
                           ] 
           }
       ),
        filter("(student=eq.true|age=lt.13)|grade=lt.3".as_bytes()))
}

#[test]
fn and_and_filter(){
    println!("{:#?}", filter("student=eq.true&age=lt.13&grade=gte.3".as_bytes()));
    assert_eq!(
       IResult::Done("".as_bytes(), 
           Filter { 
               connector: None, 
               condition: Condition { 
                       left: Operand::Column("student".to_owned()), 
                       equality: Equality::EQ, 
                       right: Operand::Boolean(true) }, 
                       sub_filters: vec![
                               Filter { 
                                   connector: Some(Connector::AND), 
                                   condition: Condition { 
                                               left: Operand::Column("age".to_owned()), 
                                               equality: Equality::LT, 
                                               right: Operand::Number(13f64) 
                                           }, 
                                   sub_filters: vec![ ] 
                               },
                               Filter { 
                               connector: Some(Connector::AND), 
                               condition: Condition { 
                                       left:  Operand::Column("grade".to_owned()), 
                                       equality: Equality::GTE, 
                                       right:  Operand::Number(3f64)
                                   }, 
                               sub_filters: vec![] 
                               }
                              
                           ] 
           }
       ),
        filter("student=eq.true&age=lt.13&grade=gte.3".as_bytes()))
}

#[test]
fn or_filter(){
    assert_eq!(
       IResult::Done("".as_bytes(), 
           Filter { 
               connector: None, 
               condition: Condition { 
                       left: Operand::Column("student".to_owned()), 
                       equality: Equality::EQ, 
                       right: Operand::Boolean(true) }, 
                       sub_filters: vec![
                               Filter { 
                                   connector: Some(Connector::OR), 
                                   condition: Condition { 
                                               left: Operand::Column("age".to_owned()), 
                                               equality: Equality::LT, 
                                               right: Operand::Number(13f64) 
                                           }, 
                                   sub_filters: vec![] 
                               }
                           ] 
           }
       ),
        filter("student=eq.true|age=lt.13".as_bytes()))
}

#[test]
fn function_filter(){
    assert_eq!(
       IResult::Done("".as_bytes(), 
           Filter { 
               connector: None, 
               condition: Condition { 
                       left: Operand::Column("student".to_owned()), 
                       equality: Equality::EQ, 
                       right: Operand::Boolean(true) }, 
                       sub_filters: vec![
                               Filter { 
                                   connector: Some(Connector::OR), 
                                   condition: Condition { 
                                               left: Operand::Function(Function{
                                                               function: "max".to_owned(),
                                                               params: vec![Operand::Column("age".to_owned())]
                                                           }),
                                               equality: Equality::LT, 
                                               right: Operand::Number(13f64) 
                                           }, 
                                   sub_filters: vec![] 
                               }
                           ] 
           }
       ),
        filter("student=eq.true|max(age)=lt.13".as_bytes()))
}


#[test]
fn recursive_function_filter(){
    assert_eq!(
       IResult::Done("".as_bytes(), 
           Filter { 
               connector: None, 
               condition: Condition { 
                       left: Operand::Column("student".to_owned()), 
                       equality: Equality::EQ, 
                       right: Operand::Boolean(true) }, 
                       sub_filters: vec![
                               Filter { 
                                   connector: Some(Connector::OR), 
                                   condition: Condition { 
                                               left: Operand::Function(Function{
                                                               function: "max".to_owned(),
                                                               params: vec![Operand::Function(Function{
                                                                                        function: "sum".to_owned(),
                                                                                        params: vec![Operand::Column("age".to_owned())], 
                                                                                    })]
                                                           }),
                                               equality: Equality::LT, 
                                               right: Operand::Number(13f64) 
                                           }, 
                                   sub_filters: vec![] 
                               }
                           ] 
           }
       ),
        filter("student=eq.true|max(sum(age))=lt.13".as_bytes()))
}

#[test]
fn or_or_filter(){
    println!("{:#?}",filter("student=eq.true|age=lt.13|grade=gte.3".as_bytes()));
    assert_eq!(
       IResult::Done("".as_bytes(), 
           Filter { 
               connector: None, 
               condition: Condition { 
                       left: Operand::Column("student".to_owned()), 
                       equality: Equality::EQ, 
                       right: Operand::Boolean(true) }, 
                       sub_filters: vec![
                               Filter { 
                                   connector: Some(Connector::OR), 
                                   condition: Condition { 
                                               left: Operand::Column("age".to_owned()), 
                                               equality: Equality::LT, 
                                               right: Operand::Number(13f64) 
                                           }, 
                                   sub_filters: vec![] 
                               },
                               Filter { 
                                   connector: Some(Connector::OR), 
                                   condition: Condition { 
                                           left:  Operand::Column("grade".to_owned()), 
                                           equality: Equality::GTE, 
                                           right:  Operand::Number(3f64)
                                       }, 
                                   sub_filters: vec![] 
                               }
                               
                           ] 
           }
       ),
        filter("student=eq.true|age=lt.13|grade=gte.3".as_bytes()))
}


#[test]
fn and_or_filter(){
    println!("{:#?}",filter("student=eq.true&age=lt.13|grade=gte.3".as_bytes()));
    assert_eq!(
       IResult::Done("".as_bytes(), 
           Filter { 
               connector: None, 
               condition: Condition { 
                       left: Operand::Column("student".to_owned()), 
                       equality: Equality::EQ, 
                       right: Operand::Boolean(true) }, 
                       sub_filters: vec![
                               Filter { 
                                   connector: Some(Connector::AND), 
                                   condition: Condition { 
                                               left: Operand::Column("age".to_owned()), 
                                               equality: Equality::LT, 
                                               right: Operand::Number(13f64) 
                                           }, 
                                   sub_filters: vec![ ] 
                               },
                               Filter { 
                                   connector: Some(Connector::OR), 
                                   condition: Condition { 
                                           left:  Operand::Column("grade".to_owned()), 
                                           equality: Equality::GTE, 
                                           right:  Operand::Number(3f64)
                                       }, 
                                   sub_filters: vec![] 
                               }
                               
                           ] 
           }
       ),
        filter("student=eq.true&age=lt.13|grade=gte.3".as_bytes()))
}


#[test]
fn or_and_filter(){
    assert_eq!(
       IResult::Done("".as_bytes(), 
           Filter { 
               connector: None, 
               condition: Condition { 
                       left: Operand::Column("student".to_owned()), 
                       equality: Equality::EQ, 
                       right: Operand::Boolean(true) }, 
                       sub_filters: vec![
                               Filter { 
                                   connector: Some(Connector::OR), 
                                   condition: Condition { 
                                               left: Operand::Column("age".to_owned()), 
                                               equality: Equality::LT, 
                                               right: Operand::Number(13f64) 
                                           }, 
                                   sub_filters: vec![] 
                               },
                               Filter { 
                                   connector: Some(Connector::AND), 
                                   condition: Condition { 
                                           left:  Operand::Column("grade".to_owned()), 
                                           equality: Equality::GTE, 
                                           right:  Operand::Number(3f64)
                                       }, 
                                   sub_filters: vec![] 
                               }
                               
                           ] 
           }
       ),
        filter("student=eq.true|age=lt.13&grade=gte.3".as_bytes()))
}


//#[test]
fn enclosed_or_and_filter(){
    assert_eq!(
       IResult::Done("".as_bytes(), 
           Filter { 
               connector: None, 
               condition: Condition { 
                       left: Operand::Column("student".to_owned()), 
                       equality: Equality::EQ, 
                       right: Operand::Boolean(true) }, 
                       sub_filters: vec![
                               Filter { 
                                   connector: Some(Connector::OR), 
                                   condition: Condition { 
                                               left: Operand::Column("age".to_owned()), 
                                               equality: Equality::LT, 
                                               right: Operand::Number(13f64) 
                                           }, 
                                   sub_filters: vec![
                                           Filter { 
                                               connector: Some(Connector::AND), 
                                               condition: Condition { 
                                                       left:  Operand::Column("grade".to_owned()), 
                                                       equality: Equality::GTE, 
                                                       right:  Operand::Number(3f64)
                                                   }, 
                                               sub_filters: vec![] 
                                           }
                                   ] 
                               },
                               
                           ] 
           }
       ),
        filter("student=eq.true|(age=lt.13&grade=gte.3)".as_bytes()))
}


//#[test]
fn enclosed_or_and_filter2(){
    assert_eq!(
       IResult::Done("".as_bytes(), 
           Filter { 
               connector: None, 
               condition: Condition { 
                       left: Operand::Column("student".to_owned()), 
                       equality: Equality::EQ, 
                       right: Operand::Boolean(true) }, 
                       sub_filters: vec![
                               Filter { 
                                   connector: Some(Connector::AND), 
                                   condition: Condition { 
                                               left: Operand::Column("age".to_owned()), 
                                               equality: Equality::LT, 
                                               right: Operand::Number(13f64) 
                                           }, 
                                   sub_filters: vec![
                                           Filter { 
                                               connector: Some(Connector::OR), 
                                               condition: Condition { 
                                                       left:  Operand::Column("grade".to_owned()), 
                                                       equality: Equality::GTE, 
                                                       right:  Operand::Number(3f64)
                                                   }, 
                                               sub_filters: vec![] 
                                           }
                                   ] 
                               },
                               
                           ] 
           }
       ),
        filter("student=eq.true&(age=lt.13|grade=gte.3)".as_bytes()))
}

#[test]
fn or_and_filter_with_function(){
    assert_eq!(
       IResult::Done("".as_bytes(), 
           Filter { 
               connector: None, 
               condition: Condition { 
                       left: Operand::Column("student".to_owned()), 
                       equality: Equality::EQ, 
                       right: Operand::Boolean(true) }, 
                       sub_filters: vec![
                               Filter { 
                                   connector: Some(Connector::OR), 
                                   condition: Condition { 
                                               left: Operand::Column("age".to_owned()), 
                                               equality: Equality::LT, 
                                               right: Operand::Number(13f64) 
                                           }, 
                                   sub_filters: vec![] 
                               },
                               Filter { 
                                       connector: Some(Connector::AND), 
                                       condition: Condition { 
                                               left:  Operand::Function(Function{
                                                           function:"min".to_owned(),
                                                           params: vec![Operand::Column("grade".to_owned())]
                                                       }), 
                                               equality: Equality::GTE, 
                                               right:  Operand::Number(3f64)
                                           }, 
                                       sub_filters: vec![] 
                                   }
                               
                           ] 
           }
       ),
        filter("student=eq.true|age=lt.13&min(grade)=gte.3".as_bytes()))
}

#[test]
fn equal_filter(){
    assert_eq!(filter("student=eq.true".as_bytes()),filter("((student=eq.true))".as_bytes()))
}

//#[test]
fn equal_and_and(){
    assert_eq!(filter("student=eq.true&(age=lt.13&grade=gte.3)".as_bytes()),filter("student=eq.true&age=lt.13&grade=gte.3".as_bytes()))
}

//#[test]
fn equal_or_or(){
    assert_eq!(filter("student=eq.true|(age=lt.13|grade=gte.3)".as_bytes()),filter("student=eq.true|age=lt.13|grade=gte.3".as_bytes()))
}


//#[test]
fn equal_enclosed_or(){
    assert_eq!(filter("(student=eq.true|age=lt.13)".as_bytes()),filter("student=eq.true|age=lt.13".as_bytes()))
}

//#[test]
fn equal_enclosed_and(){
    assert_eq!(filter("(student=eq.true&age=lt.13)".as_bytes()),filter("student=eq.true&age=lt.13".as_bytes()))
}