tests/testthat/test-lazy_list.R

test_that("lazy lists work", {
  generator <- coro::generator(function() {
    coro::yield(1)
    coro::yield(2)
    coro::yield(3)
  })

  x <- lazy_list(generator)

  expect_equal(next_value(x), 1)
  expect_equal(next_value(x), 2)
  expect_equal(next_value(x), 3)

  expect_equal(next_value_start(x), 1)
  expect_equal(next_value(x), 2)
  expect_equal(next_value(x), 3)
  expect_equal(next_value(x), coro::exhausted())
})

test_that("eager lists work", {
  data <- list(1, 2, 3, 4)

  x <- eager_list(data)

  expect_equal(next_value(x), 1)
  expect_equal(next_value(x), 2)
  expect_equal(next_value(x), 3)

  expect_equal(next_value_start(x), 1)
  expect_equal(next_value(x), 2)
  expect_equal(next_value(x), 3)
  expect_equal(next_value(x), 4)
  expect_equal(next_value(x), coro::exhausted())

  expect_equal(x[[1]], 1)
})

test_that("Subsetting lazy lists works", {
  generator <- coro::generator(function() {
    coro::yield(1)
    coro::yield(2)
    coro::yield(3)
  })

  x <- lazy_list(generator)

  expect_equal(x[[2]], 2)
  expect_equal(x[[1]], 1)
  expect_equal(length(x), 3)
  expect_equal(x[[4]], NULL)
  expect_equal(x[[3]], 3)
  expect_equal(length(x), 3)

  expect_s3_class(x[1], "lazy_list")
  expect_equal(as.list(x[1]), list(1))
  expect_equal(as.list(x[-2]), list(1, 3))
  expect_equal(as.list(x[1:4]), list(1, 2, 3))
  expect_equal(as.list(x[-2:-3]), list(1))
  expect_equal(as.list(x[-4]), list(1, 2, 3))

  reset_iterator(x)

  expect_equal(as.list(x[2:3]), list(2, 3))
  expect_equal(as.list(x[3:4]), list(3))

  reset_iterator(x)

  expect_equal(as.list(x[-1]), list(2, 3))
  expect_equal(as.list(x), as.list(x))
})

test_that("Filtering lazy lists works", {
  generator <- coro::generator(function() {
    coro::yield(1)
    coro::yield(2)
    coro::yield(3)
  })

  x <- lazy_list(generator)

  expect_s3_class(
    lazy_filter(x, function(x) x %% 2 == 0),
    "lazy_list"
  )

  expect_equal(
    as.list(lazy_filter(x, function(x) x %% 2 == 0)),
    list(2)
  )

  expect_equal(
    as.list(lazy_filter(x, function(x) x %% 2 != 0)),
    list(1, 3)
  )
})

test_that("lazy_map() works", {
  generator <- coro::generator(function() {
    coro::yield(1)
    coro::yield(2)
    coro::yield(3)
  })

  x <- lazy_list(generator)

  expect_s3_class(
    lazy_map(x, function(x) x + 1),
    "lazy_list"
  )

  expect_equal(
    as.list(lazy_map(x, function(x) x + 1)),
    list(2, 3, 4)
  )
})

test_that("lazy_flatten() works", {
  generator <- coro::generator(function() {
    coro::yield(1)
    coro::yield(2)
    coro::yield(3)
  })

  x_1 <- lazy_list(generator)

  generator_2 <- coro::generator(function() {
    coro::yield(1)
    coro::yield(2)
  })

  x_2 <- lazy_list(generator_2)

  final_generator <- coro::generator(function() {
    coro::yield(x_1)
    coro::yield(x_2)
    coro::yield(x_1)
  })

  final_list <- lazy_list(final_generator)

  expect_s3_class(lazy_flatten(final_list), "lazy_list")

  expect_equal(
    as.list(lazy_flatten(final_list)),
    list(1, 2, 3, 1, 2, 1, 2, 3)
  )
})

test_that("combine_lazy_lists() works", {
  generator <- coro::generator(function() {
    coro::yield(1)
    coro::yield(2)
    coro::yield(3)
  })

  x_1 <- lazy_list(generator)

  generator_2 <- coro::generator(function() {
    coro::yield(1)
    coro::yield(2)
  })

  x_2 <- lazy_list(generator_2)

  final_list <- list(x_1, x_2, x_1)

  expect_s3_class(combine_lazy_lists(final_list), "lazy_list")

  expect_equal(
    as.list(combine_lazy_lists(final_list)),
    list(1, 2, 3, 1, 2, 1, 2, 3)
  )
})

test_that("lazy_intersect_by() works", {
  generator <- coro::generator(function() {
    coro::yield(1)
    coro::yield(2)
    coro::yield(3)
    coro::yield(5)
  })

  x_1 <- lazy_list(generator)

  generator_2 <- coro::generator(function() {
    coro::yield(2)
    coro::yield(4)
    coro::yield(5)
  })

  x_2 <- lazy_list(generator_2)

  generator_3 <- coro::generator(function() {
    coro::yield(2)
    coro::yield(5)
  })

  x_3 <- lazy_list(generator_3)

  final_list <- list(x_1, x_2, x_3)

  expect_s3_class(lazy_intersect_by(final_list, `==`), "lazy_list")

  expect_equal(
    as.list(lazy_intersect_by(final_list, `==`)),
    list(2, 5)
  )
})

test_that("lazy_unique() works", {
  generator <- coro::generator(function() {
    coro::yield(1)
    coro::yield(2)
    coro::yield(3)
    coro::yield(5)
  })

  x_1 <- lazy_list(generator)

  generator_2 <- coro::generator(function() {
    coro::yield(2)
    coro::yield(4)
    coro::yield(5)
  })

  x_2 <- lazy_list(generator_2)

  generator_3 <- coro::generator(function() {
    coro::yield(2)
    coro::yield(5)
  })

  x_3 <- lazy_list(generator_3)

  final_list <- list(x_1, x_2, x_3)

  expect_s3_class(lazy_unique(final_list, `==`), "lazy_list")

  expect_equal(
    as.list(lazy_unique(final_list, `==`)),
    list(1, 2, 3, 5, 4)
  )
})

Try the selenider package in your browser

Any scripts or data that you put into this service are public.

selenider documentation built on April 3, 2025, 5:51 p.m.