1test_that("Serializing and unserializing a map", {
2  # Test with difficult encodings (code borrowed from encoding tests)
3  m <- fastmap()
4
5  k1 <- "abc"
6  # "åbc" in UTF-8
7  k2 <- "\u00e5bc"
8  # "åbc" in latin1
9  k3 <- iconv(k2, from = "UTF-8", to = "latin1")
10  # "中 A" in UTF-8
11  k4 <- "\u4e2d A"
12  k5 <- "xyz"
13
14  m$set(k1, 1)
15  m$set(k2, 2)
16  m$set(k3, 3)
17  m$set(k4, 4)
18  m$set(k5, 5)
19  m$remove(k1)  # Make a hole
20
21  m1 <- unserialize(serialize(m, NULL))
22  expect_mapequal(m$as_list(), m1$as_list())
23  expect_identical(m$size(), m1$size())
24  expect_setequal(m$keys(), m1$keys())
25  expect_true(all(Encoding(m1$keys()) %in% c("unknown", "UTF-8")))
26
27  # Make sure that m1 behaves correctly when modified
28  m$set(k1, 10)
29  m$set(k3, 30)
30  m1$set(k1, 10)
31  m1$set(k3, 30)
32  expect_mapequal(m$as_list(), m1$as_list())
33  expect_identical(m$size(), m1$size())
34  expect_true(all(Encoding(m1$keys()) %in% c("unknown", "UTF-8")))
35})
36
37test_that("Serializing and unserializing stress test", {
38  set.seed(3524)
39
40  n <- 1e4
41  # Generate keys and values.
42  values <- rnorm(n)
43  keys <- as.character(values)
44
45  m <- fastmap()
46  add_order <- sample.int(n)
47  for (i in add_order) {
48    m$set(keys[i], values[i])
49  }
50
51  # Then remove 1/3 them in random order
52  remove_order <- sample.int(n, size = round(1/3 * n))
53  for (i in remove_order) {
54    m$remove(keys[i])
55  }
56
57  m1 <- unserialize(serialize(m, NULL))
58  expect_mapequal(m$as_list(), m1$as_list())
59  expect_identical(m$size(), m1$size())
60  expect_setequal(m$keys(), m1$keys())
61
62
63  # Add some random subset of values to m and m1, and make sure the result is
64  # the same.
65  add_order <- sample.int(n, size = round(1/3 * n))
66  for (i in add_order) {
67    m$set(keys[i], values[i])
68    m1$set(keys[i], values[i])
69  }
70  expect_mapequal(m$as_list(), m1$as_list())
71  expect_identical(m$size(), m1$size())
72  expect_setequal(m$keys(), m1$keys())
73
74  # Remove a subset of values from m and m1, and make sure the result is the
75  # same.
76  remove_order <- sample.int(n, size = round(1/3 * n))
77  for (i in remove_order) {
78    m$remove(keys[i])
79    m1$remove(keys[i])
80  }
81  expect_mapequal(m$as_list(), m1$as_list())
82  expect_identical(m$size(), m1$size())
83  expect_setequal(m$keys(), m1$keys())
84})
85