#include "cpp11/raws.hpp"
#include "Rversion.h"
#include
context("raws-C++") {
test_that("raws.push_back()") {
cpp11::writable::raws x;
x.push_back('a');
x.push_back('b');
expect_true(x.size() == 2);
expect_true(x[0] == 'a');
expect_true(x[1] == 'b');
}
test_that("raws.resize()") {
cpp11::writable::raws x;
x.resize(2);
x[0] = 'a';
x[1] = 'b';
expect_true(x.size() == 2);
expect_true(x[0] == 'a');
expect_true(x[1] == 'b');
}
test_that("raws.at()") {
cpp11::writable::raws x;
expect_error(x.at(-1));
expect_error(x.at(0));
x.push_back('a');
expect_true(x.at(0) == 'a');
expect_error(x.at(1));
}
test_that("raws.pop_back()") {
cpp11::writable::raws x;
x.push_back('a');
x.push_back('b');
x.pop_back();
expect_true(x.size() == 1);
expect_true(x[0] == 'a');
expect_error(x.at(1));
}
test_that("raws.insert()") {
cpp11::writable::raws x;
x.insert(0, 'a');
x.insert(0, 'b');
x.insert(1, 'c');
expect_true(x.size() == 3);
expect_true(x[0] == 'b');
expect_true(x[1] == 'c');
expect_true(x[2] == 'a');
}
test_that("raws.erase()") {
cpp11::writable::raws x;
x.push_back('a');
x.push_back('b');
x.push_back('c');
x.push_back('d');
x.push_back('e');
expect_true(x.size() == 5);
x.erase(0);
expect_true(x.size() == 4);
expect_true(x[0] == 'b');
expect_true(x[1] == 'c');
expect_true(x[2] == 'd');
expect_true(x[3] == 'e');
x.erase(2);
expect_true(x.size() == 3);
expect_true(x[0] == 'b');
expect_true(x[1] == 'c');
expect_true(x[2] == 'e');
}
test_that("raws.iterator* = ") {
cpp11::writable::raws x;
x.push_back('a');
x.push_back('b');
x.push_back('c');
auto it = x.begin() + 1;
*it = 'd';
++it;
*it = 'e';
expect_true(x.size() == 3);
expect_true(x[0] == 'a');
expect_true(x[1] == 'd');
expect_true(x[2] == 'e');
}
test_that("writable::raws(SEXP)") {
SEXP x = PROTECT(Rf_allocVector(RAWSXP, 5));
RAW(x)[0] = 'a';
RAW(x)[1] = 'b';
RAW(x)[2] = 'c';
RAW(x)[3] = 'd';
RAW(x)[4] = 'e';
cpp11::writable::raws y(x);
y[0] = '\0';
expect_true(x != y.data());
expect_true(RAW(x)[0] == 'a');
expect_true(y[0] == '\0');
cpp11::writable::raws z(y);
z[0] = 'f';
expect_true(z.data() != y.data());
expect_true(RAW(x)[0] == 'a');
expect_true(y[0] == '\0');
expect_true(z[0] == 'f');
UNPROTECT(1);
}
test_that("writable::raws(initializer_list)") {
using namespace cpp11::literals;
SEXP x1 = PROTECT(Rf_allocVector(RAWSXP, 1));
SEXP x2 = PROTECT(Rf_allocVector(RAWSXP, 1));
SEXP x3 = PROTECT(Rf_allocVector(RAWSXP, 1));
#if R_VERSION >= R_Version(4, 2, 0)
SET_RAW_ELT(x1, 0, 1);
SET_RAW_ELT(x2, 0, 2);
SET_RAW_ELT(x3, 0, 255);
#else
RAW(x1)[0] = 1;
RAW(x2)[0] = 2;
RAW(x3)[0] = 255;
#endif
// From scalar raw vectors
cpp11::writable::raws x({"one"_nm = x1, "two"_nm = x2, "three"_nm = x3});
expect_true(x.named());
expect_true(x["one"] == 1);
expect_true(x["two"] == 2);
expect_true(x["three"] == 255);
UNPROTECT(3);
}
test_that("writable::raws(initializer_list) type check") {
using namespace cpp11::literals;
expect_error_as(cpp11::writable::raws({"one"_nm = true}), cpp11::type_error);
expect_error_as(cpp11::writable::raws({"one"_nm = R_NilValue}), cpp11::type_error);
// `as_sexp()` turns this into an `INTSXP`, which is not compatible
expect_error_as(cpp11::writable::raws({"one"_nm = 1}), cpp11::type_error);
}
test_that("writable::raws(initializer_list) length check") {
using namespace cpp11::literals;
SEXP x = PROTECT(Rf_allocVector(RAWSXP, 2));
expect_error_as(cpp11::writable::raws({"x"_nm = x}), std::length_error);
UNPROTECT(1);
}
test_that("writable::raws(initializer_list)") {
cpp11::writable::raws x({1, 2, 255});
expect_true(x[0] == 1);
expect_true(x[1] == 2);
expect_true(x[2] == 255);
}
// test_that("writable::raws(ALTREP_SEXP)") {
// SEXP x = PROTECT(R_compact_uint8_trange(1, 5));
//// Need to find (or create) an altrep class that implements duplicate.
// cpp11::writable::raws y(x);
// y[0] = -1;
// expect_true(x != y.data());
// expect_true(raw_ELT(x, 0) == 1);
// expect_true(y[0] == -1);
// cpp11::writable::raws z(y);
// z[0] = -2;
// expect_true(z.data() != y.data());
// expect_true(raw_ELT(x, 0) == 1);
// expect_true(y[0] == -1);
// expect_true(z[0] == -2);
// z.push_back(6);
// expect_true(z[5] == 6);
// UNPROTECT(1);
//}
}