tests/testthat/test_scale.R

context("test_scale.R")
requireNamespace("data.table")
verbose <- TRUE
## build_scales
# -------------
test_that("build_scale: scale compute a mean an a sd for each numeric col", {
    # Given
    some_values <- 1 : 11
    data_set <- data.table(col_1 = some_values)

    # When
    scales <- build_scales(data_set, verbose = verbose)

    # Then
    expect_equal(length(scales), sum(sapply(data_set, is.numeric)))
    expect_equal(length(scales[["col_1"]]), 2)
    expect_equal(scales[["col_1"]]$mean, mean(some_values))
    expect_equal(scales[["col_1"]]$sd, sd(some_values))
})


## fast_scale
# ----------
test_that("fast_scale: should be able to apply scale", {
    # Given
    data_set <- data.table(col_1 = 1 : 10)
    scales <- build_scales(data_set, verbose = verbose)

    # When
    data_set_scaled <- fast_scale(data_set, scales = scales, verbose = verbose)

    # Then
    expect_true(mean(data_set_scaled[["col_1"]]) < 10 ^ - 2) # compared to 10^-2 to allow a small gap
    expect_true(sd(data_set_scaled[["col_1"]]) - 1 < 10 ^ - 2)
})


test_that("fast_scale: should be able to apply unscale and retrieve original values", {
    # Given
    data_set <- data.table(col_1 = 1 : 10)
    scales <- build_scales(data_set, verbose = verbose)
    data_set_scaled <- fast_scale(data_set, scales = scales, verbose = verbose)

    # When
    data_set_unscaled <- fast_scale(data_set_scaled, scales = scales, way = "unscale", verbose = verbose)

    # Then
    expect_true(sum(sum(abs(data_set_unscaled - data_set))) < 10 ^ - 2)
})


## .control_scale_way
# -------------------
test_that("Private function: .control_scale_way: non character way", {
    # Given
    wrong_way <- 1

    # When and Then
    expect_error(.control_scale_way(wrong_way),
    ": way should be a character either 'scale' or 'unscale'")
})

test_that("Private function: .control_scale_way: unchorect character way", {
    # Given
    wrong_way <- "a"

    # When and Then
    expect_error(.control_scale_way(wrong_way),
    ": way should either be 'scale' or 'unscale'")
})


## .build_and_control_scale
# -------------------------
test_that("Private function: .build_and_control_scale: if scale is not given it is built", {
    # Given
    data_set <- data.table(col_1 = 1 : 10)
    scales <- build_scales(data_set, verbose = FALSE)

    # When
    built_scales <- .build_and_control_scale(NULL, data_set, "scale")

    # Then
    expect_identical(built_scales, scales)
})


test_that("Private function: .build_and_control_scale: for way 'unscale' scales must be given", {
    # Given
    data_set <- data.table(col_1 = 1 : 10)
    scales <- build_scales(data_set, verbose = FALSE)

    # When and Then
    expect_error(.build_and_control_scale(NULL, data_set, "unscale"),
    ": to unscale, scales must be feeded by user.")
})


test_that("Private function: .build_and_control_scale", {
    # Given
    data_set <- data.table(col_1 = 1 : 10)
    scales <- build_scales(data_set, verbose = FALSE)

    # When and Then
    expect_error(.build_and_control_scale("a", data_set, "unscale"),
    ": scales should be a named list. Please build it using build_scales.")
})


test_that("Private function: .build_and_control_scale: for unscale empty list is acceptable scales", {
    # Given
    data_set <- data.table(col_1 = 1 : 10)

    # When
    built_scales <- .build_and_control_scale(list(), data_set, "unscale")

    # Then
    expect_equal(built_scales, list())
})

test_that("Private function: .build_and_control_scale: throw error on un conformed scales", {
    # Given
    data_set <- data.table(col_1 = 1 : 10)
    unconform_scale_list <- list("a")

    # When and Then
    expect_error(.build_and_control_scale(unconform_scale_list, data_set, "unscale"),
    ": scales should be a named list of list having 2 elements: mean and sd. Please build it using build_scales.")
})

test_that("Private function: .build_and_control_scale: throw errors on second level unconformity", {
    # Given
    data_set <- data.table(col_1 = 1 : 10)
    unconform_scales <- list(list("a"))

    # When and Then
    expect_error(.build_and_control_scale(unconform_scales, data_set, "unscale"),
    ": scales should be a named list of list having 2 elements: mean and sd. Please build it using build_scales.")
})

test_that("Private function: .build_and_control_scale: throw error if some values are not numeric", {
    # Given
    data_set <- data.table(col_1 = 1 : 10)
    unconform_scales <- list(list(mean = "a", sd = 5))

    # When and Then
    expect_error(.build_and_control_scale(unconform_scales, data_set, "unscale"),
    paste0(": scales should be a named list of list having 2 numeric elements: mean and sd.",
           " Please build it using build_scales."))
})

Try the dataPreparation package in your browser

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

dataPreparation documentation built on July 9, 2023, 7:02 p.m.