

objects <- list(
  as.POSIXlt("2013-06-17 22:33:44"),
  as.POSIXct("2013-06-17 22:33:44"),
  as.POSIXlt("2013-06-17 22:33:44", tz="Australia/Darwin"),
  as.POSIXct("2013-06-17 22:33:44", tz="Australia/Darwin")
)

test_that("Encoding POSIXt Objects", {

  #string based formats do not depends on the current local timezone
  invisible(lapply(objects, function(object){
    expect_equal(toJSON(object), "[\"2013-06-17 22:33:44\"]");
    expect_equal(toJSON(object, POSIXt="string"), "[\"2013-06-17 22:33:44\"]");
    expect_equal(toJSON(object, POSIXt="ISO8601"), "[\"2013-06-17T22:33:44\"]");
    expect_error(toJSON(object, POSIXt="sdfsdsdf"), "one of");
  }));

  #object 1 and 2 will result in a location specific epoch
  invisible(lapply(objects[3:4], function(object){
    expect_equal(toJSON(object, POSIXt="epoch"), "[1371474224000]");
    expect_equal(toJSON(object, POSIXt="mongo"), "[{\"$date\":1371474224000}]");
  }));

});

test_that("Encoding POSIXt object in a list", {
  #string based formats do not depends on the current local timezone
  invisible(lapply(objects, function(object){
    expect_equal(toJSON(list(foo=object)), "{\"foo\":[\"2013-06-17 22:33:44\"]}");
    expect_equal(toJSON(list(foo=object), POSIXt="string"), "{\"foo\":[\"2013-06-17 22:33:44\"]}");
    expect_equal(toJSON(list(foo=object), POSIXt="ISO8601"), "{\"foo\":[\"2013-06-17T22:33:44\"]}");
    expect_error(toJSON(list(foo=object), POSIXt="sdfsdsdf"), "one of");
  }));

  #list(foo=object) 1 and 2 will result in a location specific epoch
  invisible(lapply(objects[3:4], function(object){
    expect_equal(toJSON(list(foo=object), POSIXt="epoch"), "{\"foo\":[1371474224000]}");
    expect_equal(toJSON(list(foo=object), POSIXt="mongo"), "{\"foo\":[{\"$date\":1371474224000}]}");
  }));
});

test_that("Encoding POSIXt object in a list", {
  #string based formats do not depends on the current local timezone
  invisible(lapply(objects, function(object){
    expect_equal(toJSON(data.frame(foo=object)), "[{\"foo\":\"2013-06-17 22:33:44\"}]");
    expect_equal(toJSON(data.frame(foo=object), POSIXt="string"), "[{\"foo\":\"2013-06-17 22:33:44\"}]");
    expect_equal(toJSON(data.frame(foo=object), POSIXt="ISO8601"), "[{\"foo\":\"2013-06-17T22:33:44\"}]");
    expect_error(toJSON(data.frame(foo=object), POSIXt="sdfsdsdf"), "one of");
  }));

  #list(foo=object) 1 and 2 will result in a location specific epoch
  invisible(lapply(objects[3:4], function(object){
    expect_equal(toJSON(data.frame(foo=object), POSIXt="epoch"), "[{\"foo\":1371474224000}]");
    expect_equal(toJSON(data.frame(foo=object), POSIXt="mongo"), "[{\"foo\":{\"$date\":1371474224000}}]");
  }));
});

test_that("POSIXt NA values", {
  newobj <- list(
    c(objects[[1]], NA),
    c(objects[[2]], NA)
  );
  lapply(newobj, function(object){
    expect_equal(toJSON(object), "[\"2013-06-17 22:33:44\",null]");
    expect_equal(toJSON(object, na="string"), "[\"2013-06-17 22:33:44\",\"NA\"]");
    expect_equal(toJSON(data.frame(foo=object)), "[{\"foo\":\"2013-06-17 22:33:44\"},{}]");
    expect_equal(toJSON(data.frame(foo=object), na="null"), "[{\"foo\":\"2013-06-17 22:33:44\"},{\"foo\":null}]");
    expect_equal(toJSON(data.frame(foo=object), na="string"), "[{\"foo\":\"2013-06-17 22:33:44\"},{\"foo\":\"NA\"}]");
  });

  tzobj <- list(
    c(objects[[3]], NA),
    c(objects[[4]], NA)
  );
  lapply(tzobj, function(object) {
    expect_equal(toJSON(object, POSIXt = "mongo"), "[{\"$date\":1371474224000},null]");
    expect_equal(toJSON(object, POSIXt = "mongo", na="string"), "[{\"$date\":1371474224000},\"NA\"]");
    expect_equal(toJSON(data.frame(foo=object), POSIXt = "mongo"), "[{\"foo\":{\"$date\":1371474224000}},{}]");
    expect_equal(toJSON(data.frame(foo=object), POSIXt = "mongo", na="null"), "[{\"foo\":{\"$date\":1371474224000}},{\"foo\":null}]");
    expect_equal(toJSON(data.frame(foo=object), POSIXt = "mongo", na="string"), "[{\"foo\":{\"$date\":1371474224000}},{\"foo\":\"NA\"}]");
  })
});

test_that("Negative dates", {
  x <- objects[[2]]
  y <- x - c(1e9, 2e9, 3e9)
  expect_equal(fromJSON(toJSON(y, POSIXt = "mongo")), y);
})

