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