[go: up one dir, main page]

aster 0.9.3

A libsyntax ast builder
use std::rc::Rc;

use syntax::ast;
use syntax::codemap::{DUMMY_SP, Spanned};
use syntax::ptr::P;

use aster::AstBuilder;

#[test]
fn test_int() {
    let builder = AstBuilder::new();

    fn check(lit: P<ast::Lit>, value: u64, lit_int_ty: ast::LitIntType) {
        assert_eq!(
            lit,
            P(Spanned {
                span: DUMMY_SP,
                node: ast::LitInt(value, lit_int_ty),
            })
        );
    }

    check(builder.lit().i8(1), 1, ast::SignedIntLit(ast::TyI8, ast::Plus));
    check(builder.lit().i16(1), 1, ast::SignedIntLit(ast::TyI16, ast::Plus));
    check(builder.lit().i32(1), 1, ast::SignedIntLit(ast::TyI32, ast::Plus));
    check(builder.lit().i64(1), 1, ast::SignedIntLit(ast::TyI64, ast::Plus));
    check(builder.lit().isize(1), 1, ast::SignedIntLit(ast::TyIs, ast::Plus));

    check(builder.lit().i8(-1), !0, ast::SignedIntLit(ast::TyI8, ast::Minus));
    check(builder.lit().i16(-1), !0, ast::SignedIntLit(ast::TyI16, ast::Minus));
    check(builder.lit().i32(-1), !0, ast::SignedIntLit(ast::TyI32, ast::Minus));
    check(builder.lit().i64(-1), !0, ast::SignedIntLit(ast::TyI64, ast::Minus));
    check(builder.lit().isize(-1), !0, ast::SignedIntLit(ast::TyIs, ast::Minus));

    check(builder.lit().u8(1), 1, ast::UnsignedIntLit(ast::TyU8));
    check(builder.lit().u16(1), 1, ast::UnsignedIntLit(ast::TyU16));
    check(builder.lit().u32(1), 1, ast::UnsignedIntLit(ast::TyU32));
    check(builder.lit().u64(1), 1, ast::UnsignedIntLit(ast::TyU64));
    check(builder.lit().usize(1), 1, ast::UnsignedIntLit(ast::TyUs));

    check(builder.lit().int(1), 1, ast::UnsuffixedIntLit(ast::Plus));
    check(builder.lit().int(-1), !0, ast::UnsuffixedIntLit(ast::Minus));
}

#[test]
fn test_bool() {
    let builder = AstBuilder::new();

    assert_eq!(builder.lit().bool(true),
        P(Spanned {
            span: DUMMY_SP,
            node: ast::LitBool(true)
        })
    );

    assert_eq!(builder.lit().bool(false),
        P(Spanned {
            span: DUMMY_SP,
            node: ast::LitBool(false)
        })
    );

    assert_eq!(builder.lit().true_(),
        P(Spanned {
            span: DUMMY_SP,
            node: ast::LitBool(true)
        })
    );

    assert_eq!(builder.lit().false_(),
        P(Spanned {
            span: DUMMY_SP,
            node: ast::LitBool(false)
        })
    );
}

#[test]
fn test_char() {
    let builder = AstBuilder::new();

    assert_eq!(builder.lit().char('a'),
        P(Spanned {
            span: DUMMY_SP,
            node: ast::LitChar('a')
        })
    );
}

#[test]
fn test_byte() {
    let builder = AstBuilder::new();

    assert_eq!(builder.lit().byte(b'a'),
        P(Spanned {
            span: DUMMY_SP,
            node: ast::LitByte(b'a')
        })
    );
}

#[test]
fn test_str() {
    let builder = AstBuilder::new();

    assert_eq!(builder.lit().str("string"),
        P(Spanned {
            span: DUMMY_SP,
            node: ast::LitStr(
                builder.interned_string("string"),
                ast::CookedStr,
            ),
        })
    );
}

#[test]
fn test_byte_str() {
    let builder = AstBuilder::new();

    assert_eq!(builder.lit().byte_str(&b"string"[..]),
        P(Spanned {
            span: DUMMY_SP,
            node: ast::LitByteStr(Rc::new(Vec::from(&b"string"[..]))),
        })
    );
}