tests/testthat/test-parser.R

context("test-parser")

#
# Numbers
#

test_that("A number", {
  ast <- DSLite::testParse("3")
  expect_true(inherits(ast, "NumericNode"))
  expect_equal(ast$to_string(), "3")
})

test_that("A negative number", {
  ast <- DSLite::testParse("-0.43151402098822")
  expect_true(inherits(ast, "NumericNode"))
  expect_equal(ast$to_string(), "-0.43151402098822")
})

test_that("A number with floating point", {
  ast <- DSLite::testParse("3.1")
  expect_true(inherits(ast, "NumericNode"))
  expect_equal(ast$to_string(), "3.1")
})

test_that("A number with floating point and exponent", {
  ast <- DSLite::testParse("3.1e4")
  expect_true(inherits(ast, "NumericNode"))
  expect_equal(ast$to_string(), "3.1e4")
  # upper case exponent
  ast <- DSLite::testParse("3.1E4")
  expect_true(inherits(ast, "NumericNode"))
  expect_equal(ast$to_string(), "3.1E4")
})

test_that("A number with floating point, exponent and negative signs", {
  ast <- DSLite::testParse("-3.1e-4")
  expect_true(inherits(ast, "NumericNode"))
  expect_equal(ast$to_string(), "-3.1e-4")
})

test_that("A number with floating point, exponent and positive signs", {
  ast <- DSLite::testParse("+3.1e+4")
  expect_true(inherits(ast, "NumericNode"))
  expect_equal(ast$to_string(), "+3.1e+4")
})

test_that("An integer", {
  ast <- DSLite::testParse("3L")
  expect_true(inherits(ast, "NumericNode"))
  expect_equal(ast$to_string(), "3L")
})

#
# Strings
#

test_that("An single quote string", {
  ast <- DSLite::testParse("'A'")
  expect_true(inherits(ast, "StringNode"))
  expect_equal(ast$to_string(), "'A'")
  
  ast <- DSLite::testParse("'A_b.123$Z:A2'")
  expect_true(inherits(ast, "StringNode"))
  expect_equal(ast$to_string(), "'A_b.123$Z:A2'")
  
  ast <- DSLite::testParse("'3L'")
  expect_true(inherits(ast, "StringNode"))
  expect_equal(ast$to_string(), "'3L'")

  ast <- DSLite::testParse("'-3.1e+4'")
  expect_true(inherits(ast, "StringNode"))
  expect_equal(ast$to_string(), "'-3.1e+4'")
  
  ast <- DSLite::testParse("''")
  expect_true(inherits(ast, "StringNode"))
  expect_equal(ast$to_string(), "''")
})

test_that("An double quote string", {
  ast <- DSLite::testParse("\"A\"")
  expect_true(inherits(ast, "StringNode"))
  expect_equal(ast$to_string(), "\"A\"")
  
  ast <- DSLite::testParse("\"A_b.123$Z:A2\"")
  expect_true(inherits(ast, "StringNode"))
  expect_equal(ast$to_string(), "\"A_b.123$Z:A2\"")
  
  ast <- DSLite::testParse("\"3L\"")
  expect_true(inherits(ast, "StringNode"))
  expect_equal(ast$to_string(), "\"3L\"")
  
  ast <- DSLite::testParse("\"-3.1e+4\"")
  expect_true(inherits(ast, "StringNode"))
  expect_equal(ast$to_string(), "\"-3.1e+4\"")
  
  ast <- DSLite::testParse("\"\"")
  expect_true(inherits(ast, "StringNode"))
  expect_equal(ast$to_string(), "\"\"")
})

test_that("String with invalid chars", {
  expect_error(DSLite::testParse("'A%B'"))
  expect_error(DSLite::testParse("'A@B'"))
  expect_error(DSLite::testParse("'A&B'"))
  expect_error(DSLite::testParse("'A|B'"))
  expect_error(DSLite::testParse("'A B'"))
  expect_error(DSLite::testParse("'A(B)'"))
  expect_error(DSLite::testParse("'A[B]'"))
  expect_error(DSLite::testParse("'A*B'"))
  expect_error(DSLite::testParse("'A\\B'"))
  expect_error(DSLite::testParse("'A<-B'"))
  expect_error(DSLite::testParse("'A\""))
  expect_error(DSLite::testParse("\"A'"))
  # FIXME why not an error? problem with R regexpr?
  #expect_error(ast <- DSLite::testParse("'A/B'", debug = T))
})

#
# Symbol
#

test_that("A symbol", {
  ast <- DSLite::testParse("abc")
  expect_true(inherits(ast, "SymbolNode"))
  expect_equal(ast$to_string(), "abc")

  ast <- DSLite::testParse("abc-DEF.123X$var_12")
  expect_true(inherits(ast, "SymbolNode"))
  expect_equal(ast$to_string(), "abc-DEF.123X$var_12")
})

test_that("Symbol with invalid chars", {
  expect_error(DSLite::testParse("A[2, 1]"))
  expect_error(DSLite::testParse("A[2, 1:2]"))
  expect_error(DSLite::testParse("A[, 1]"))
  expect_error(DSLite::testParse("A[1,]"))
  expect_error(DSLite::testParse("A[, 1:2]"))
  expect_error(DSLite::testParse("A[]"))
  expect_error(DSLite::testParse("A[,]"))
  expect_error(DSLite::testParse("A[[]]"))
})

#
# Parameter
#

test_that("A named expression", {
  ast <- DSLite::testParse("abc = 'pwel'")
  expect_true(inherits(ast, "ParameterNode"))
  expect_equal(ast$to_string(), "abc = 'pwel'")

  ast <- DSLite::testParse("abc='pwel'")
  expect_true(inherits(ast, "ParameterNode"))
  expect_equal(ast$to_string(), "abc = 'pwel'")
})

#
# Operators
#

test_that("Arithmetic binary operators", {
  ast <- DSLite::testParse("1 + 2 * 3/4 - 5")
  expect_true(inherits(ast, "BinaryOpNode"))
  expect_equal(ast$to_string(), "1 + 2 * 3 / 4 - 5")
})

test_that("Pct operators", {
  ast <- DSLite::testParse("A %in% B")
  expect_true(inherits(ast, "BinaryOpNode"))
  expect_equal(ast$to_string(), "A %in% B")
})

test_that("A range operation", {
  ast <- DSLite::testParse("1:10")
  expect_true(inherits(ast, "RangeNode"))
  expect_equal(ast$to_string(), "1:10")
})

test_that("Unary not operator", {
  ast <- DSLite::testParse("!A")
  expect_true(inherits(ast, "UnaryOpNode"))
  expect_equal(ast$to_string(), "!A")
})

#
# Group
#

test_that("Some groups", {
  ast <- DSLite::testParse("(A + B) * (C - D)")
  expect_true(inherits(ast$children[[1]], "GroupNode"))
  expect_true(inherits(ast$children[[2]], "GroupNode"))
  expect_equal(ast$to_string(), "(A + B) * (C - D)")
})

#
# Formula
#

test_that("A formula", {
  ast <- DSLite::testParse("A ~ B")
  expect_true(inherits(ast, "FormulaNode"))
  expect_equal(ast$to_string(), "A ~ B")
  
  ast <- DSLite::testParse("A~B")
  expect_true(inherits(ast, "FormulaNode"))
  expect_equal(ast$to_string(), "A ~ B")
  
  ast <- DSLite::testParse("A ~ B.C_123$D")
  expect_true(inherits(ast, "FormulaNode"))
  expect_equal(ast$to_string(), "A ~ B.C_123$D")

  ast <- DSLite::testParse("A ~ 123")
  expect_true(inherits(ast, "FormulaNode"))
  expect_equal(ast$to_string(), "A ~ 123")
})

test_that("A formula with operators", {
  ast <- DSLite::testParse("A ~ B + C")
  expect_true(inherits(ast, "FormulaNode"))
  expect_equal(ast$to_string(), "A ~ B + C")
  
  ast <- DSLite::testParse("A ~ B + (C * D)")
  expect_true(inherits(ast, "FormulaNode"))
  expect_equal(ast$to_string(), "A ~ B + (C * D)")
  
  ast <- DSLite::testParse("A ~ B^4")
  expect_true(inherits(ast, "FormulaNode"))
  expect_equal(ast$to_string(), "A ~ B^4")
  
  ast <- DSLite::testParse("A ~ B : C")
  expect_true(inherits(ast, "FormulaNode"))
  expect_equal(ast$to_string(), "A ~ B:C")
  
  ast <- DSLite::testParse("A ~ (B : C)")
  expect_true(inherits(ast, "FormulaNode"))
  expect_equal(ast$to_string(), "A ~ (B:C)")
  
  ast <- DSLite::testParse("A ~ B %in% C")
  expect_true(inherits(ast, "FormulaNode"))
  expect_equal(ast$to_string(), "A ~ B %in% C")
  
  ast <- DSLite::testParse("A ~ (B %in% C)")
  expect_true(inherits(ast, "FormulaNode"))
  expect_equal(ast$to_string(), "A ~ (B %in% C)")
  
  ast <- DSLite::testParse("A ~ B + (C * D)^4 : E %in% F")
  expect_true(inherits(ast, "FormulaNode"))
  expect_equal(ast$to_string(), "A ~ B + (C * D)^4:E %in% F")
})

test_that("Formula with invalid syntax", {
  expect_error(DSLite::testParse("A ~ 'abc'"))
  expect_error(DSLite::testParse("D$height ~ D$diameter + poly(D$length, 3, raw=TRUE)"))
})

#
# Function
#

test_that("An empty function", {
  ast <- DSLite::testParse("some_func()")
  expect_true(inherits(ast, "FunctionNode"))
  expect_equal(ast$to_string(), "some_func()")
  
  ast <- DSLite::testParse("some_func ( )")
  expect_true(inherits(ast, "FunctionNode"))
  expect_equal(ast$to_string(), "some_func()")
  
  ast <- DSLite::testParse("some_func123.call$X()")
  expect_true(inherits(ast, "FunctionNode"))
  expect_equal(ast$to_string(), "some_func123.call$X()")
})

test_that("A function with parameters", {
  ast <- DSLite::testParse("some_func(A)")
  expect_true(inherits(ast, "FunctionNode"))
  expect_equal(ast$to_string(), "some_func(A)")
  
  ast <- DSLite::testParse("some_func(123)")
  expect_true(inherits(ast, "FunctionNode"))
  expect_equal(ast$to_string(), "some_func(123)")
  
  ast <- DSLite::testParse("some_func('abc')")
  expect_true(inherits(ast, "FunctionNode"))
  expect_equal(ast$to_string(), "some_func('abc')")
  
  ast <- DSLite::testParse("some_func(\"abc\")")
  expect_true(inherits(ast, "FunctionNode"))
  expect_equal(ast$to_string(), "some_func(\"abc\")")
  
  ast <- DSLite::testParse("some_func('D$X')")
  expect_true(inherits(ast, "FunctionNode"))
  expect_equal(ast$to_string(), "some_func('D$X')")
  
  ast <- DSLite::testParse("some_func('1.2,1.3,-8.5')")
  expect_true(inherits(ast, "FunctionNode"))
  expect_equal(ast$to_string(), "some_func('1.2,1.3,-8.5')")
  
  ast <- DSLite::testParse("some_func(x = 123)")
  expect_true(inherits(ast, "FunctionNode"))
  expect_equal(ast$to_string(), "some_func(x = 123)")
  
  ast <- DSLite::testParse("some_func(x = A ~ B)")
  expect_true(inherits(ast, "FunctionNode"))
  expect_equal(ast$to_string(), "some_func(x = A ~ B)")
  
  ast <- DSLite::testParse("some_func(another_func(A))")
  expect_true(inherits(ast, "FunctionNode"))
  expect_equal(ast$to_string(), "some_func(another_func(A))")
  
  ast <- DSLite::testParse("some_func(B, C(), D, E(F(G/H)), A + B * C())")
  expect_true(inherits(ast, "FunctionNode"))
  expect_equal(ast$to_string(), "some_func(B, C(), D, E(F(G / H)), A + B * C())")
})

Try the DSLite package in your browser

Any scripts or data that you put into this service are public.

DSLite documentation built on Oct. 7, 2022, 9:05 a.m.