tests/testthat/test-interval.R

# Tests for the interval R6 class

test_that("interval constructor creates valid object with defaults", {
  # Given: Default constructor call
  # When: Creating an interval
  i <- interval$new()

  # Then: Object represents the entire real line
  expect_s3_class(i, "interval")
  expect_equal(i$lower, -Inf)
  expect_equal(i$upper, Inf)
  expect_false(i$lower_closed)
  expect_false(i$upper_closed)
})

test_that("interval constructor creates bounded interval", {
  # Given: Specific bounds
  i <- interval$new(lower = 0, upper = 10, lower_closed = TRUE, upper_closed = FALSE)

  # Then: Bounds are set correctly
  expect_equal(i$lower, 0)
  expect_equal(i$upper, 10)
  expect_true(i$lower_closed)
  expect_false(i$upper_closed)
})

test_that("interval constructor handles vector bounds for multivariate", {
  # Given: Vector bounds (for multivariate support)
  lower <- c(0, -1, -Inf)
  upper <- c(10, 1, Inf)

  i <- interval$new(lower = lower, upper = upper)

  expect_equal(i$lower, lower)
  expect_equal(i$upper, upper)
  expect_equal(i$dim(), 3)
})

test_that("interval constructor replicates bounds to match lengths", {
  # Given: Mismatched length bounds
  i <- interval$new(lower = c(0, 0), upper = 10)

  # Then: upper should be replicated
  expect_equal(i$lower, c(0, 0))
  expect_equal(i$upper, c(10, 10))
})

test_that("interval constructor replicates closed flags", {
  i <- interval$new(lower = c(0, 0), upper = c(1, 1),
                    lower_closed = TRUE, upper_closed = FALSE)

  expect_equal(i$lower_closed, c(TRUE, TRUE))
  expect_equal(i$upper_closed, c(FALSE, FALSE))
})

test_that("interval$has correctly checks membership for closed interval", {
  # [0, 10]
  i <- interval$new(lower = 0, upper = 10, lower_closed = TRUE, upper_closed = TRUE)

  expect_true(i$has(0))
  expect_true(i$has(5))
  expect_true(i$has(10))
  expect_false(i$has(-1))
  expect_false(i$has(11))
})

test_that("interval$has correctly checks membership for open interval", {
  # (0, 10)
  i <- interval$new(lower = 0, upper = 10, lower_closed = FALSE, upper_closed = FALSE)

  expect_false(i$has(0))
  expect_true(i$has(5))
  expect_false(i$has(10))
  expect_true(i$has(0.001))
  expect_true(i$has(9.999))
})

test_that("interval$has correctly checks membership for half-open interval", {
  # [0, 10)
  i <- interval$new(lower = 0, upper = 10, lower_closed = TRUE, upper_closed = FALSE)

  expect_true(i$has(0))
  expect_true(i$has(5))
  expect_false(i$has(10))
})

test_that("interval$has handles infinite bounds correctly", {
  # (-Inf, Inf) - the real line
  i <- interval$new()

  expect_true(i$has(0))
  expect_true(i$has(-1e100))
  expect_true(i$has(1e100))
})

test_that("interval$has handles vector input for multivariate", {
  i <- interval$new(lower = c(0, 0), upper = c(1, 1),
                    lower_closed = TRUE, upper_closed = TRUE)

  expect_true(all(i$has(c(0.5, 0.5))))
  expect_true(all(i$has(c(0, 0))))
  expect_true(all(i$has(c(1, 1))))
  expect_false(all(i$has(c(0.5, 2))))
})

test_that("interval$infimum returns lower bound", {
  i <- interval$new(lower = 5, upper = 10)

  expect_equal(i$infimum(), 5)
})

test_that("interval$infimum returns vector for multivariate", {
  i <- interval$new(lower = c(1, 2, 3), upper = c(4, 5, 6))

  expect_equal(i$infimum(), c(1, 2, 3))
})

test_that("interval$supremum returns upper bound", {
  i <- interval$new(lower = 5, upper = 10)

  expect_equal(i$supremum(), 10)
})

test_that("interval$supremum returns vector for multivariate", {
  i <- interval$new(lower = c(1, 2, 3), upper = c(4, 5, 6))

  expect_equal(i$supremum(), c(4, 5, 6))
})

test_that("interval$dim returns 1 for univariate", {
  i <- interval$new(lower = 0, upper = 1)

  expect_equal(i$dim(), 1)
})

test_that("interval$dim returns correct dimension for multivariate", {
  i <- interval$new(lower = rep(0, 5), upper = rep(1, 5))

  expect_equal(i$dim(), 5)
})

test_that("interval$is_empty detects empty intervals", {
  # Empty: lower > upper
  i1 <- interval$new(lower = 10, upper = 5)
  expect_true(i1$is_empty())

  # Empty: same bound but not both closed
  i2 <- interval$new(lower = 5, upper = 5, lower_closed = TRUE, upper_closed = FALSE)
  expect_true(i2$is_empty())

  # Not empty: same bound and both closed (single point)
  i3 <- interval$new(lower = 5, upper = 5, lower_closed = TRUE, upper_closed = TRUE)
  expect_false(i3$is_empty())
})

test_that("has.interval S3 wrapper works correctly", {
  i <- interval$new(lower = 0, upper = 1, lower_closed = TRUE, upper_closed = TRUE)

  expect_true(has(i, 0.5))
  expect_false(has(i, 2))
})

test_that("infimum.interval S3 wrapper works correctly", {
  i <- interval$new(lower = 3, upper = 7)

  expect_equal(infimum(i), 3)
})

test_that("supremum.interval S3 wrapper works correctly", {
  i <- interval$new(lower = 3, upper = 7)

  expect_equal(supremum(i), 7)
})

test_that("dim.interval S3 wrapper works correctly", {
  i <- interval$new(lower = c(0, 0), upper = c(1, 1))

  expect_equal(dim(i), 2)
})

test_that("print.interval produces output without error", {
  i <- interval$new(lower = 0, upper = 1, lower_closed = TRUE, upper_closed = FALSE)

  expect_output(print(i), "\\[0, 1\\)")
})

test_that("print.interval shows correct brackets for different closedness", {
  # Open interval
  i1 <- interval$new(lower = 0, upper = 1, lower_closed = FALSE, upper_closed = FALSE)
  expect_output(print(i1), "\\(0, 1\\)")

  # Closed interval
  i2 <- interval$new(lower = 0, upper = 1, lower_closed = TRUE, upper_closed = TRUE)
  expect_output(print(i2), "\\[0, 1\\]")
})

test_that("interval handles semi-infinite intervals", {
  # [0, Inf)
  i1 <- interval$new(lower = 0, upper = Inf, lower_closed = TRUE, upper_closed = FALSE)
  expect_true(i1$has(0))
  expect_true(i1$has(1e100))
  expect_false(i1$has(-1))

  # (-Inf, 0]
  i2 <- interval$new(lower = -Inf, upper = 0, lower_closed = FALSE, upper_closed = TRUE)
  expect_true(i2$has(0))
  expect_true(i2$has(-1e100))
  expect_false(i2$has(1))
})

Try the algebraic.dist package in your browser

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

algebraic.dist documentation built on Feb. 27, 2026, 5:06 p.m.