tests/testthat/test-angle.R

library(ggdiagram)
library(testthat)


test_that("add, subtract, multiply, divide, and exponentiate degrees, radians, and turns",
          {
            purrr::map(list(degree, radian, turn), \(.f) {
              expect_equal(S7::prop(.f(.1), S7::S7_class(.f(0))@name), .1)
              expect_equal(.f(.1) + .f(.1), .f(.2))
              expect_equal(.f(.1) - .f(.1), .f(0))
              expect_equal(.f(.1) * .1, .f(.01))
              expect_equal(.f(.1) / 2, .f(.05))
              expect_equal(.f(.1)^2, .f(.01))
            })
          })

test_that("ob_angle equality", {
  expect_equal(c(degree(90)), c(ob_angle(degree = 90)))
  expect_equal(c(radian(1)), c(ob_angle(radian = 1)))
  expect_equal(c(turn(.1)), c(ob_angle(turn = .1)))
})



test_that("trig functions work with ob_angle", {
  expect_equal(cos(turn(1)), cospi(2))
  expect_equal(sin(turn(.25)), sinpi(.5))
  expect_equal(tan(turn(.5)), tanpi(1))
})

test_that("equality with ob_angle", {
  tidyr::crossing(tibble::tibble(
    .f = list(degree, radian, turn, ob_angle),
    ratio = c(360, 2 * pi, 1, 1)
  ),
  .g = list(`>`, `<`, `<=`, `>=`, `==`, `!=`)) |>
    dplyr::mutate(
      t1 = .2,
      t2 = .3,
      a1 = purrr::map2(.f, t1, \(f, t) f(t)),
      a2 = purrr::map2(.f, t2, \(f, t) f(t)),
      n1 = ratio * t1,
      n2 = ratio * t2,
      ta = purrr::pmap_lgl(list(.g, a1, a2), \(g, aa1, aa2) g(aa1, aa2)),
      tn = purrr::pmap_lgl(list(.g, n1, n2), \(g, aa1, aa2) g(aa1, aa2)),
      test = ta == tn
    ) |>
    dplyr::pull(test) |>
    all() |>
    expect_true()
})

test_that("trig angles", {
  my_turn <- 1 / 8
  purrr::map2(list(degree, radian, turn, ob_angle), c(360, 2 * pi, 1, 1), \(.f, ratio) {
    expect_equal(sin(.f(ratio * my_turn)), sinpi(2 * my_turn))
    expect_equal(cos(.f(ratio * my_turn)), cospi(2 * my_turn))
    expect_equal(tan(.f(ratio * my_turn)), tanpi(2 * my_turn))
  })
})


test_that("negative x: x@positive becomes positive", {
  expect_equal(degree(-90)@positive@degree, degree(270)@degree)
  expect_equal(degree(-90 - 360)@positive@degree, degree(270)@degree)
  expect_equal(degree(-90 - 360 * 2)@positive@degree, degree(270)@degree)
})

test_that("positive x: x@positive stays positive", {
  expect_equal(degree(90)@positive@degree, degree(90)@degree)
  expect_equal(degree(90 + 360)@positive@degree, degree(90)@degree)
  expect_equal(degree(90 + 360 * 2)@positive@degree, degree(90)@degree)
})

test_that("negative x: x@negative stays negative", {
  expect_equal(degree(-90)@negative@degree, degree(-90)@degree)
  expect_equal(degree(-90 - 360)@negative@degree, degree(-90)@degree)
  expect_equal(degree(-90 - 360 * 2)@negative@degree, degree(-90)@degree)
})

test_that("positive x: x@negative becomes negative", {
  expect_equal(degree(90)@negative@degree, degree(-270)@degree)
  expect_equal(degree(90 + 360)@negative@degree, degree(-270)@degree)
  expect_equal(degree(90 + 360 * 2)@negative@degree, degree(-270)@degree)
})


test_that("misc angle", {
  expect_equal(degree("north")@degree, radian("north")@degree)
  expect_equal(degree("north")@degree, turn("north")@degree)
  expect_equal(degree("north")@degree, turn(turn(.25))@degree)
  expect_identical(unbind(degree(1:2)), list(degree(1), degree(2)))
  expect_identical(degree(1:2)[1], degree(1))
  expect_identical(as.character(degree(2)), "2°")
  expect_identical(as.character(degree(0), digits = 2), "0°")
  expect_identical(as.character(degree(c(1,2))), c("1°", "2°"))
  expect_identical(as.character(degree(-2), digits = 2), "−2°")
  expect_identical(as.character(degree(2.45), digits = 2), "2.45°")
  expect_identical(as.character(radian(2)), "0.64π")
  expect_identical(as.character(radian(0)), "0π")
  expect_identical(as.character(radian(pi)), "π")
  expect_identical(as.character(radian(-pi)), "−π")
  expect_identical(as.character(radian(2 * pi)), "0π")
  expect_identical(as.character(radian(-2 * pi)), "0π")
  expect_identical(as.character(radian(-.1 * pi)), "−0.1π")
  expect_identical(as.character(turn(.5)), ".50")
  expect_identical(as.character(turn(0)), "0")
  expect_identical(as.character(turn(1)), "0")
  expect_identical(as.character(turn(-.5)), "−.50")
  a <- degree(0)
  a@degree <- 20
  expect_identical(a@degree, 20)
  a@radian <- pi
  expect_identical(a@radian, pi)
  a@turn <- 0.5
  expect_identical(a@turn, 0.5)

  expect_no_error(capture.output(print(a), file = nullfile()))

})

test_that(
  "selection and assignment with angles", {
    x <- degree(1:20)
    expect_identical(x[1:10], degree(1:10))
    x[2] <- degree(100)
    expect_identical(x, degree(c(1,100, 3:20)))
  }
)

Try the ggdiagram package in your browser

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

ggdiagram documentation built on Sept. 15, 2025, 1:07 a.m.