tests/testthat/test-helper.r

test_that("gen_df can give a table of exact height", {
  forall(
    gen.element(0:6) |>
      gen.and_then(\(n) list(
        gen.pure(n),
        gen_df(n, 7, minrow = n, remove_dup_rows = FALSE)
      )),
    onRight(nrow) %>>% (uncurry(expect_identical))
  )
})

test_that("gen_df can give a table of exact width", {
  forall(
    gen.element(0:7) |>
      gen.and_then(\(n) list(
        gen.pure(n),
        gen_df(6, n, mincol = n, remove_dup_rows = FALSE)
      )),
    onRight(ncol) %>>% (uncurry(expect_identical))
  )
})

test_that("gen_df can generate a tibble without name failure", {
  forall(
    gen.df_fixed_ranges("logical", "..1", 2, TRUE, "tibble"),
    expect_silent
  )
})

test_that("gen_flat_deps_fixed_names generates valid", {
  forall(gen_flat_deps_fixed_names(7, 20, to = 20L), is_valid_functional_dependency)
})

test_that("gen_flat_deps generates valid", {
  forall(gen_flat_deps(7, 20, to = 20L), is_valid_functional_dependency)
})

test_that("gen.relation_schema generates valid relation schemas", {
  forall(
    gen.element(c(FALSE, TRUE)) |>
      gen.and_then(\(sek) list(
        sek,
        gen.relation_schema(letters[1:6], 0, 8, single_empty_key = sek)
      )),
    \(sek, rs) is_valid_relation_schema(rs, single_empty_key = sek),
    curry = TRUE
  )
})

test_that("gen.relation_schema_empty_keys generates valid relation schemas, enough empty keys", {
  forall(
    gen.element(0:4) |>
      gen.and_then(\(from) {
        gen.element(0:from) |>
          gen.and_then(\(me) {
            list(
              gen.pure(from),
              gen.pure(me),
              gen.relation_schema_empty_keys(
                letters[1:6],
                from = from,
                to = 8,
                min_empty = me
              )
            )
          })
      }),
    \(from, me, rs) {
      is_valid_relation_schema(rs)
      expect_gte(
        sum(vapply(keys(rs), identical, logical(1), list(character()))),
        me
      )
    },
    curry = TRUE
  )
})

test_that("gen.database_schema generates valid database schemas", {
  forall(
    gen.element(c(FALSE, TRUE)) |>
      gen.list(of = 3) |>
      gen.and_then(uncurry(\(sek, san, skp) list(
        gen.pure(sek),
        gen.pure(san),
        gen.pure(skp),
        gen.database_schema(
          letters[1:6],
          0,
          8,
          single_empty_key = sek,
          same_attr_name = san,
          single_key_pairs = skp
        )
      ))),
    \(sek, san, skp, ds) is_valid_database_schema(
      ds,
      single_empty_key = sek,
      same_attr_name = san,
      single_key_pairs = skp
    ),
    curry = TRUE
  )
})

test_that("gen.database_schema_empty_keys generates valid relation schemas, enough empty keys", {
  forall(
    list(
      gen.element(c(FALSE, TRUE)),
      gen.element(c(FALSE, TRUE)),
      gen.element(0:4)
    ) |>
      gen.and_then(uncurry(\(san, skp, from) list(
        gen.pure(san),
        gen.pure(skp),
        gen.element(0:from) |>
          gen.and_then(\(me) {
            list(
              gen.pure(me),
              gen.database_schema_empty_keys(
                letters[1:6],
                from = from,
                to = 8,
                min_empty = me,
                same_attr_name = san,
                single_key_pairs = skp
              )
            )
          })
      ))) |>
      gen.with(uncurry(\(san, skp, lst) {
        c(list(san, skp), lst)
      })),
    \(san, skp, me, ds) {
      is_valid_database_schema(
        ds,
        same_attr_name = san,
        single_key_pairs = skp
      )
      expect_gte(
        sum(vapply(keys(ds), identical, logical(1), list(character()))),
        me
      )
    },
    curry = TRUE
  )
})

test_that("gen.relation generates valid relations", {
  forall(
    gen.element(c(FALSE, TRUE)) |>
      gen.and_then(\(sek) list(
        gen.pure(sek),
        gen.relation(letters[1:4], 6, 7, single_empty_key = sek)
      )),
    \(sek, r) is_valid_relation(r, single_empty_key = sek),
    curry = TRUE
  )
})

test_that("gen.database generates valid databases", {
  forall(
    gen.element(c(FALSE, TRUE)) |>
      gen.list(of = 3) |>
      gen.and_then(uncurry(\(sek, san, skp) list(
        gen.pure(sek),
        gen.pure(san),
        gen.pure(skp),
        gen.database(
          letters[1:7],
          from = 0,
          to = 6,
          single_empty_key = sek,
          same_attr_name = san,
          single_key_pairs = skp
        )
      ))),
    \(sek, san, skp, ds) is_valid_database(
      ds,
      single_empty_key = sek,
      same_attr_name = san,
      single_key_pairs = skp
    ),
    curry = TRUE
  )
})

test_that("remove_insertion_key_violations removes violations", {
  forall(
    gen.relation(letters[1:4], 0, 6) |>
      gen.and_then(\(r) {
        list(
          gen.pure(r),
          gen.int(10) |>
            gen.and_then(with_args(
              gen.df_fixed_ranges,
              classes = rep("logical", length(attrs_order(r))),
              nms = attrs_order(r),
              remove_dup_rows = TRUE
            ))
        )
      }) |>
      gen.with(uncurry(\(r, df) {
        list(
          r,
          unclass(r),
          df,
          remove_insertion_key_violations(df, r)
        )
      })),
    \(r, r_unclassed, df, df_trimmed) {
      recs <- records(r)
      ks <- keys(r)
      expect_true(all(vapply(
        seq_along(r),
        \(n) {
          r_df <- recs[[n]]
          new_rel <- df_unique(rbind(r_df, df_trimmed[, names(r_df), drop = FALSE]))
          all(vapply(
            ks[[n]],
            \(key) {!df_anyDuplicated(new_rel[, key, drop = FALSE])},
            logical(1)
          ))
        },
        logical(1)
      )))
    },
    curry = TRUE
  )
})

Try the autodb package in your browser

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

autodb documentation built on April 4, 2025, 5:12 a.m.