test_that("Encoding Numbers", {
  expect_equal(toJSON(35), "[35]")
  expect_equal(toJSON(35L), "[35]")
  expect_equal(toJSON(c(35, pi), digits = 5), "[35,3.14159]")
  expect_equal(toJSON(pi, digits = 0), "[3]")
  expect_equal(toJSON(pi, digits = 2), "[3.14]")
  expect_equal(toJSON(pi, digits = 10), "[3.1415926536]")
  expect_equal(toJSON(c(pi, NA), na = "string", digits = 5), "[3.14159,\"NA\"]")
  expect_equal(toJSON(c(pi, NA), na = "null", digits = 5), "[3.14159,null]")
  expect_equal(toJSON(c(pi, NA), na = "null", digits = 5), "[3.14159,null]")
  expect_equal(toJSON(c(1478002353.51369, -521997646.486311) * 1000, digits = 0), "[1478002353514,-521997646486]")
  expect_equal(toJSON(list(a = c(0.1)), digits = NA), '{"a":[0.1]}')
})

test_that("Encoding Numbers in Data Frame", {
  expect_equal(toJSON(data.frame(foo = 35)), "[{\"foo\":35}]")
  expect_equal(toJSON(data.frame(foo = 35L)), "[{\"foo\":35}]")
  expect_equal(toJSON(data.frame(foo = c(35, pi)), digits = 5), "[{\"foo\":35},{\"foo\":3.14159}]")
  expect_equal(toJSON(data.frame(foo = pi), digits = 0), "[{\"foo\":3}]")
  expect_equal(toJSON(data.frame(foo = pi), digits = 2), "[{\"foo\":3.14}]")
  expect_equal(toJSON(data.frame(foo = pi), digits = 10), "[{\"foo\":3.1415926536}]")
  expect_equal(toJSON(data.frame(foo = c(pi, NA)), digits = 5), "[{\"foo\":3.14159},{}]")
  expect_equal(toJSON(data.frame(foo = c(pi, NA)), na = "string", digits = 5), "[{\"foo\":3.14159},{\"foo\":\"NA\"}]")
  expect_equal(toJSON(data.frame(foo = c(pi, NA)), na = "null", digits = 5), "[{\"foo\":3.14159},{\"foo\":null}]")
})

test_that("Force decimal works", {
  # Force decimal for doubles
  expect_equal(toJSON(100), '[100]')
  expect_equal(toJSON(100, always_decimal = TRUE), '[100.0]')
  expect_equal(toJSON(12.000000000001, always_decimal = TRUE), '[12.0]')

  # But not for integers
  expect_equal(toJSON(100L), '[100]')
  expect_equal(toJSON(100L, always_decimal = TRUE), '[100]')

  # Test range
  x <- 10^c(-15:20)
  x1 <- c(rev(-x), x)
  x2 <- 1.2345 * x1
  expect_equal(as.list(x1), fromJSON(toJSON(x1), simplifyVector = FALSE))
  expect_equal(as.list(x2), fromJSON(toJSON(x2, digits = 9), simplifyVector = FALSE))

  # always_decimal makes sure that doubles stay real
  y2 <- fromJSON(toJSON(x1, digits = 9, always_decimal = TRUE), simplifyVector = FALSE)
  expect_identical(as.list(x1), y2)
})
