use super::super::*;
use crate::lalr::TokenType::*;

#[test]
fn _0001() {
  let scope = scope!();
  accept(
    &scope,
    StartExpression,
    r#"  1  // eol comment
         + 1"#,
    r#"
       Add
       ├─ Numeric
       │  └─ `1`
       └─ Numeric
          └─ `1`
    "#,
    false,
  );
}

#[test]
fn _0002() {
  let scope = scope!();
  accept(
    &scope,
    StartExpression,
    r#" 1
          /*
          some intro waffle
          */
          + 1"#,
    r#"
       Add
       ├─ Numeric
       │  └─ `1`
       └─ Numeric
          └─ `1`
    "#,
    false,
  );
}

#[test]
fn _0003() {
  let scope = scope!();
  accept(
    &scope,
    StartExpression,
    r#"1 + /* 1 + */ 1"#,
    r#"
       Add
       ├─ Numeric
       │  └─ `1`
       └─ Numeric
          └─ `1`
    "#,
    false,
  );
}

#[test]
fn _0004() {
  let scope = scope!();
  accept(
    &scope,
    StartExpression,
    r#" 1
          /*
          some intro waffle
          */
          + 1 // and stuff
          + 2"#,
    r#"
       Add
       ├─ Add
       │  ├─ Numeric
       │  │  └─ `1`
       │  └─ Numeric
       │     └─ `1`
       └─ Numeric
          └─ `2`
    "#,
    false,
  );
}

#[test]
fn _0005() {
  let scope = scope!();
  accept(
    &scope,
    StartExpression,
    r#"
            // Some multi-line comment
            // composed from
            // multiple single-line
            // comments
            1 + 2 
    "#,
    r#"
       Add
       ├─ Numeric
       │  └─ `1`
       └─ Numeric
          └─ `2`
    "#,
    false,
  );
}

#[test]
fn _0006() {
  let scope = scope!();
  accept(
    &scope,
    StartExpression,
    r#"
            /*
             * Some multi-line comment
             * composed from...
             */
             
            /*
             *
             * ...multiple multi-line
             * comments
             */ 
             
            5 * 8 
    "#,
    r#"
       Mul
       ├─ Numeric
       │  └─ `5`
       └─ Numeric
          └─ `8`
    "#,
    false,
  );
}

#[test]
fn _0007() {
  let scope = scope!();
  accept(
    &scope,
    StartBoxedExpression,
    r#"
      /// Maybe this comment may be used
      /// for some documentation, like in Rust?
      
      //! Or for some global documentation too, like in Rust?
      {
        /// Maybe this comment may be used for some documentation, like in Rust?
        
        /*
         * We will see.
         */
        A: /* This is cool :-), not like in JSON :-( */ 15 // Just set fiveteen.
      }
    "#,
    r#"
       Context
       └─ ContextEntry
          ├─ ContextEntryKey
          │  └─ `A`
          └─ Numeric
             └─ `15`
    "#,
    false,
  );
}
