tests/testthat/test-angle.r

expect_congruent <- function(x, y, ...) expect_true(is_congruent(x, y, ...))

test_that("standardize_angular_unit()", {
    expect_equal(standardize_angular_unit("degrees"), "degrees")
    expect_equal(standardize_angular_unit("degree"), "degrees")
    expect_equal(standardize_angular_unit("deg"), "degrees")

    expect_equal(standardize_angular_unit("half-turn"), "pi-radians")
    expect_equal(standardize_angular_unit("half-revolution"), "pi-radians")
    expect_equal(standardize_angular_unit("pi * radians"), "pi-radians")

    expect_equal(standardize_angular_unit("gradians"), "gradians")
    expect_equal(standardize_angular_unit("gradian"), "gradians")
    expect_equal(standardize_angular_unit("grade"), "gradians")
    expect_equal(standardize_angular_unit("grad"), "gradians")
    expect_equal(standardize_angular_unit("gon"), "gradians")

    expect_equal(standardize_angular_unit("radians"), "radians")
    expect_equal(standardize_angular_unit("radian"), "radians")
    expect_equal(standardize_angular_unit("rad"), "radians")

    expect_equal(standardize_angular_unit("revolution"), "turns")
    expect_equal(standardize_angular_unit("rev"), "turns")
    expect_equal(standardize_angular_unit("turn"), "turns")
    expect_equal(standardize_angular_unit("tr"), "turns")

    expect_error(standardize_angular_unit("foobars"),
                 "Do not recognize angular unit 'foobars'")
})

test_that("format.angle() and print.angle()", {
    skip_if_not(l10n_info()[["UTF-8"]])
    skip_if_not_installed("withr")
    withr::local_options(cli.unicode = TRUE, affiner_angular_unit = "degrees")
    expect_equal(format(angle(180, "degrees")), "180\u00b0")
    expect_equal(format(angle(200, "gradians")), "200 gon")
    expect_equal(format(angle(pi, "radians")), "3.141593 rad")
    expect_equal(format(angle(1, "pi-radians")), "1\u03c0 rad")
    expect_equal(format(angle(0.5, "turns")), "0.5 tr")
    expect_equal(format(angle()), character())

    expect_output(print(angle()), "<angle<degrees>\\[0\\]>")
    expect_output(print(angle(200, "gradians")), "\\[1\\] 200 gon")
})

test_that("to_radians() / from_radians()", {
    expect_equal(from_radians(to_radians(180, "degrees"), "degrees"), 180)
    expect_equal(from_radians(to_radians(1, "pi-radians"), "pi-radians"), 1)
    expect_equal(from_radians(to_radians(100, "gradians"), "gradians"), 100)
    expect_equal(from_radians(to_radians(pi, "radians"), "radians"), pi)
    expect_equal(from_radians(to_radians(0.5, "turns"), "turns"), 0.5)
})

test_that("to_piradians() / from_piradians()", {
    expect_equal(from_piradians(to_piradians(180, "degrees"), "degrees"), 180)
    expect_equal(from_piradians(to_piradians(1, "pi-radians"), "pi-radians"), 1)
    expect_equal(from_piradians(to_piradians(100, "gradians"), "gradians"), 100)
    expect_equal(from_piradians(to_piradians(pi, "radians"), "radians"), pi)
    expect_equal(from_piradians(to_piradians(0.5, "turns"), "turns"), 0.5)
})

test_that("angular_unit()", {
    a <- angle(seq(0, 360, by = 90), "degrees")
    expect_equal(angular_unit(a), "degrees")
    angular_unit(a) <- "degrees"
    angular_unit(a) <- "turns"
    expect_equal(angular_unit(a), "turns")
    expect_equal(as.numeric(a), seq(0, 1, by = 0.25))
    expect_equal(angular_unit(gradians(0)), "gradians")
    expect_equal(angular_unit(turns(0)), "turns")
})

test_that("is_congruent()", {
    a1 <- angle(180, "degrees")
    a2 <- angle(0.5, "turns")
    a3 <- angle(-180, "degrees")
    a4 <- angle(90, "degrees")
    expect_congruent(a1, a2)
    expect_congruent(a1, a3)
    expect_false(is_congruent(a1, a3, mod_turns = FALSE))
    expect_equal(a1, -a3)
    expect_congruent(a1, 180)
    expect_congruent(2 * a1, 360)
    expect_congruent(a1 - a2, 0)
    expect_congruent(a4, as_angle("y-axis", "degrees"))
    expect_congruent(degrees(0), as_angle("x-axis", "degrees"))
    expect_congruent(angle(1e-9, "half-turns"), angle(-1e-9, "half-turns"))
    expect_false(is_congruent(a1, a4))
    expect_congruent(2, 2)
})

test_that("abs()", {
    expect_equal(angle(90, "degrees"), abs(angle(-270, "degrees")))
    expect_equal(angle(100, "gradians"), abs(angle(-300, "gradians")))
    expect_equal(angle(1, "pi-radians"), abs(angle(3, "pi-radians")))
    expect_equal(angle(0.5, "turns"), abs(angle(-0.5, "turns")))
    expect_equal(angle(pi, "radians"), abs(angle(-pi, "radians")))
})

test_that("as.numeric.angle()", {
    a1 <- angle(180, "degrees")
    expect_identical(as.numeric(a1), 180)
    expect_identical(as.numeric(a1, "deg"), 180)
    expect_equal(as.numeric(a1, "turns"), 0.5)
    expect_equal(as.numeric(a1, "radians"), pi)
    a2 <- angle(pi, "radians")
    expect_equal(as.numeric(a2), pi)
    expect_equal(Arg(a2), pi)
    expect_equal(as.numeric(a2, "degrees"), 180)

    c1 <- complex(real = 0, imaginary = 1)
    expect_equal(c1, as.complex(angle(90, "degrees"), modulus = 1))
    expect_congruent(as_angle(c1), angle(90, "degrees"))
})

test_that("base R trigonometric functions", {
    a1 <- angle(180, "degrees")
    expect_equal(cos(a1), cos(pi))
    expect_equal(sin(a1), sin(pi))
    expect_equal(tan(a1), tan(pi))
    a2 <- angle(pi, "radians")
    expect_equal(cos(a2), cos(pi))
    expect_equal(sin(a2), sin(pi))
    expect_equal(tan(a2), tan(pi))
})

test_that("as_angle()", {
    skip_if_not_installed("withr")
    withr::local_options(affiner_options(default = TRUE))
    a1 <- angle(180, "degrees")
    expect_equal(a1, (as_angle(a1)))
    expect_equal(a1, (as_angle(a1, "degrees")))
    expect_equal(a1, degrees(180))
    expect_equal(a1, degrees(angle(1, "pi-radians")))
    expect_congruent(a1, as_angle(a1, "turns"))
    expect_congruent(a1, pi_radians(1))
    expect_congruent(a1, radians(pi))
    expect_false(isTRUE(all.equal(a1, as_angle(a1, "turns"), check.attributes = TRUE)))
    expect_warning(as_angle("foobar"))

    expect_equal(as_angle(as_coord3d("z-axis"), "degrees", type = "azimuth"),
                 angle(0, "degrees"))
    expect_equal(as_angle(as_coord3d("z-axis"), "degrees", type = "inclination"),
                 angle(0, "degrees"))
    expect_equal(as_angle(as_coord3d("x-axis"), "degrees", type = "azimuth"),
                 angle(0, "degrees"))
    expect_equal(as_angle(as_coord3d("x-axis"), "degrees", type = "inclination"),
                 angle(90, "degrees"))
    expect_equal(as_angle(as_coord3d("y-axis"), "degrees", type = "azimuth"),
                 angle(90, "degrees"))
    expect_equal(as_angle(as_coord3d("y-axis"), "degrees", type = "inclination"),
                 angle(90, "degrees"))
    expect_equal(as_angle(as_coord3d(1, 1, -1), "degrees", type = "azimuth"),
                 angle(45, "degrees"))
    expect_equal(as_angle(as_coord3d(1, 1, -1), "degrees", type = "inclination"),
                 arccosine(-1 / sqrt(3), "degrees"))
    expect_equal(as_angle(as_coord3d(0, 1, -1), "degrees", type = "inclination"),
                 angle(135, "degrees"))
})

test_that("c.angle()", {
    a1 <- angle(180, "degrees")
    a2 <- angle(1, "pi-radians")
    expect_equal(c(a1, a2), angle(c(180, 180), "degrees"))

    expect_equal(rep_len(a1, 4), angle(rep(180, 4), "degrees"))
})

Try the affiner package in your browser

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

affiner documentation built on April 4, 2025, 4:42 a.m.