test_that("check_card_api() new interface", {
  local_options(lifecycle_verbosity = "quiet")

  expect_same(
    check_card_api(data_mcard_1(), data_mcard_2(), x_select = a, y_select = c(a = b)),
    check_card_api(x = data_mcard_1(), data_mcard_2(), x_select = a, y_select = c(a = b)),
    check_card_api(data_mcard_1(), y = data_mcard_2(), x_select = a, y_select = c(a = b)),
    check_card_api(x = data_mcard_1(), y = data_mcard_2(), x_select = a, y_select = c(a = b)),
    check_card_api(y = data_mcard_2(), x = data_mcard_1(), x_select = a, y_select = c(a = b)),
    check_card_api(data_mcard_1(), a, data_mcard_2(), c(a = b))
  )

  expect_same(
    check_card_api(data_mcard_1(), data_mcard_2(), x_select = a, y_select = b, by_position = TRUE),
    check_card_api(
      x = data_mcard_1(),
      data_mcard_2(),
      x_select = a,
      y_select = b,
      by_position = TRUE
    ),
    check_card_api(
      data_mcard_1(),
      y = data_mcard_2(),
      x_select = a,
      y_select = b,
      by_position = TRUE
    ),
    check_card_api(
      x = data_mcard_1(),
      y = data_mcard_2(),
      x_select = a,
      y_select = b,
      by_position = TRUE
    ),
    check_card_api(
      y = data_mcard_2(),
      x = data_mcard_1(),
      x_select = a,
      y_select = b,
      by_position = TRUE
    ),
    check_card_api(data_mcard_1(), a, data_mcard_2(), b)
  )
})

test_that("check_cardinality_...() functions work without `x_select` and `y_select`", {
  expect_silent(check_cardinality_0_n(data_card_1(), data_card_11()))
  expect_silent(check_cardinality_1_n(data_card_1(), data_card_12()))
  # compute(): Can't open the same table twice on MySQL
  expect_silent(check_cardinality_1_1(
    data_card_1(),
    suppress_mssql_message(compute(data_card_1()))
  ))
  expect_silent(check_cardinality_0_1(data_card_1(), data_card_11()))

  expect_snapshot({
    examine_cardinality(data_card_1(), data_card_11())
    examine_cardinality(data_card_1(), data_card_12())
    # compute(): Can't open the same table twice on MySQL
    examine_cardinality(data_card_1(), suppress_mssql_message(compute(data_card_1())))
    examine_cardinality(data_card_1(), data_card_11())
  })
})

test_that("check_card_api() compatibility", {
  local_options(lifecycle_verbosity = "quiet")

  expect_same(
    check_card_api(data_mcard_1(), a, data_mcard_2(), b),
    check_card_api(
      parent_table = data_mcard_1(),
      pk_column = a,
      child_table = data_mcard_2(),
      fk_column = b
    )
  )
  expect_same(
    check_card_api(fk_column = b, data_mcard_1(), a, data_mcard_2()),
    check_card_api(data_mcard_1(), fk_column = b, a, data_mcard_2()),
    check_card_api(data_mcard_1(), a, fk_column = b, data_mcard_2()),
    check_card_api(data_mcard_1(), a, data_mcard_2(), fk_column = b)
  )
  expect_same(
    check_card_api(child_table = data_mcard_2(), data_mcard_1(), a, b),
    check_card_api(data_mcard_1(), child_table = data_mcard_2(), a, b),
    check_card_api(data_mcard_1(), a, child_table = data_mcard_2(), b),
    check_card_api(data_mcard_1(), a, b, child_table = data_mcard_2())
  )
  expect_same(
    check_card_api(child_table = data_mcard_2(), fk_column = b, data_mcard_1(), a),
    check_card_api(child_table = data_mcard_2(), data_mcard_1(), fk_column = b, a),
    check_card_api(child_table = data_mcard_2(), data_mcard_1(), a, fk_column = b),
    check_card_api(fk_column = b, child_table = data_mcard_2(), data_mcard_1(), a),
    check_card_api(fk_column = b, data_mcard_1(), child_table = data_mcard_2(), a),
    check_card_api(fk_column = b, data_mcard_1(), a, child_table = data_mcard_2()),
    check_card_api(data_mcard_1(), child_table = data_mcard_2(), fk_column = b, a),
    check_card_api(data_mcard_1(), child_table = data_mcard_2(), a, fk_column = b),
    check_card_api(data_mcard_1(), fk_column = b, child_table = data_mcard_2(), a),
    check_card_api(data_mcard_1(), fk_column = b, a, child_table = data_mcard_2()),
    check_card_api(data_mcard_1(), a, child_table = data_mcard_2(), fk_column = b),
    check_card_api(data_mcard_1(), a, fk_column = b, child_table = data_mcard_2())
  )
  expect_same(
    check_card_api(pk_column = a, data_mcard_1(), data_mcard_2(), b),
    check_card_api(data_mcard_1(), pk_column = a, data_mcard_2(), b),
    check_card_api(data_mcard_1(), data_mcard_2(), pk_column = a, b),
    check_card_api(data_mcard_1(), data_mcard_2(), b, pk_column = a)
  )
  expect_same(
    check_card_api(pk_column = a, fk_column = b, data_mcard_1(), data_mcard_2()),
    check_card_api(pk_column = a, data_mcard_1(), fk_column = b, data_mcard_2()),
    check_card_api(pk_column = a, data_mcard_1(), data_mcard_2(), fk_column = b),
    check_card_api(fk_column = b, pk_column = a, data_mcard_1(), data_mcard_2()),
    check_card_api(fk_column = b, data_mcard_1(), pk_column = a, data_mcard_2()),
    check_card_api(fk_column = b, data_mcard_1(), data_mcard_2(), pk_column = a),
    check_card_api(data_mcard_1(), pk_column = a, fk_column = b, data_mcard_2()),
    check_card_api(data_mcard_1(), pk_column = a, data_mcard_2(), fk_column = b),
    check_card_api(data_mcard_1(), fk_column = b, pk_column = a, data_mcard_2()),
    check_card_api(data_mcard_1(), fk_column = b, data_mcard_2(), pk_column = a),
    check_card_api(data_mcard_1(), data_mcard_2(), pk_column = a, fk_column = b),
    check_card_api(data_mcard_1(), data_mcard_2(), fk_column = b, pk_column = a)
  )
  expect_same(
    check_card_api(pk_column = a, child_table = data_mcard_2(), data_mcard_1(), b),
    check_card_api(pk_column = a, data_mcard_1(), child_table = data_mcard_2(), b),
    check_card_api(pk_column = a, data_mcard_1(), b, child_table = data_mcard_2()),
    check_card_api(child_table = data_mcard_2(), pk_column = a, data_mcard_1(), b),
    check_card_api(child_table = data_mcard_2(), data_mcard_1(), pk_column = a, b),
    check_card_api(child_table = data_mcard_2(), data_mcard_1(), b, pk_column = a),
    check_card_api(data_mcard_1(), pk_column = a, child_table = data_mcard_2(), b),
    check_card_api(data_mcard_1(), pk_column = a, b, child_table = data_mcard_2()),
    check_card_api(data_mcard_1(), child_table = data_mcard_2(), pk_column = a, b),
    check_card_api(data_mcard_1(), child_table = data_mcard_2(), b, pk_column = a),
    check_card_api(data_mcard_1(), b, pk_column = a, child_table = data_mcard_2()),
    check_card_api(data_mcard_1(), b, child_table = data_mcard_2(), pk_column = a)
  )
  expect_same(
    check_card_api(pk_column = a, child_table = data_mcard_2(), fk_column = b, data_mcard_1()),
    check_card_api(pk_column = a, child_table = data_mcard_2(), data_mcard_1(), fk_column = b),
    check_card_api(pk_column = a, fk_column = b, child_table = data_mcard_2(), data_mcard_1()),
    check_card_api(pk_column = a, fk_column = b, data_mcard_1(), child_table = data_mcard_2()),
    check_card_api(pk_column = a, data_mcard_1(), child_table = data_mcard_2(), fk_column = b),
    check_card_api(pk_column = a, data_mcard_1(), fk_column = b, child_table = data_mcard_2()),
    check_card_api(child_table = data_mcard_2(), pk_column = a, fk_column = b, data_mcard_1()),
    check_card_api(child_table = data_mcard_2(), pk_column = a, data_mcard_1(), fk_column = b),
    check_card_api(child_table = data_mcard_2(), fk_column = b, pk_column = a, data_mcard_1()),
    check_card_api(child_table = data_mcard_2(), fk_column = b, data_mcard_1(), pk_column = a),
    check_card_api(child_table = data_mcard_2(), data_mcard_1(), pk_column = a, fk_column = b),
    check_card_api(child_table = data_mcard_2(), data_mcard_1(), fk_column = b, pk_column = a),
    check_card_api(fk_column = b, pk_column = a, child_table = data_mcard_2(), data_mcard_1()),
    check_card_api(fk_column = b, pk_column = a, data_mcard_1(), child_table = data_mcard_2()),
    check_card_api(fk_column = b, child_table = data_mcard_2(), pk_column = a, data_mcard_1()),
    check_card_api(fk_column = b, child_table = data_mcard_2(), data_mcard_1(), pk_column = a),
    check_card_api(fk_column = b, data_mcard_1(), pk_column = a, child_table = data_mcard_2()),
    check_card_api(fk_column = b, data_mcard_1(), child_table = data_mcard_2(), pk_column = a),
    check_card_api(data_mcard_1(), pk_column = a, child_table = data_mcard_2(), fk_column = b),
    check_card_api(data_mcard_1(), pk_column = a, fk_column = b, child_table = data_mcard_2()),
    check_card_api(data_mcard_1(), child_table = data_mcard_2(), pk_column = a, fk_column = b),
    check_card_api(data_mcard_1(), child_table = data_mcard_2(), fk_column = b, pk_column = a),
    check_card_api(data_mcard_1(), fk_column = b, pk_column = a, child_table = data_mcard_2()),
    check_card_api(data_mcard_1(), fk_column = b, child_table = data_mcard_2(), pk_column = a)
  )
  expect_same(
    check_card_api(parent_table = data_mcard_1(), a, data_mcard_2(), b),
    check_card_api(a, parent_table = data_mcard_1(), data_mcard_2(), b),
    check_card_api(a, data_mcard_2(), parent_table = data_mcard_1(), b),
    check_card_api(a, data_mcard_2(), b, parent_table = data_mcard_1())
  )
  expect_same(
    check_card_api(parent_table = data_mcard_1(), fk_column = b, a, data_mcard_2()),
    check_card_api(parent_table = data_mcard_1(), a, fk_column = b, data_mcard_2()),
    check_card_api(parent_table = data_mcard_1(), a, data_mcard_2(), fk_column = b),
    check_card_api(fk_column = b, parent_table = data_mcard_1(), a, data_mcard_2()),
    check_card_api(fk_column = b, a, parent_table = data_mcard_1(), data_mcard_2()),
    check_card_api(fk_column = b, a, data_mcard_2(), parent_table = data_mcard_1()),
    check_card_api(a, parent_table = data_mcard_1(), fk_column = b, data_mcard_2()),
    check_card_api(a, parent_table = data_mcard_1(), data_mcard_2(), fk_column = b),
    check_card_api(a, fk_column = b, parent_table = data_mcard_1(), data_mcard_2()),
    check_card_api(a, fk_column = b, data_mcard_2(), parent_table = data_mcard_1()),
    check_card_api(a, data_mcard_2(), parent_table = data_mcard_1(), fk_column = b),
    check_card_api(a, data_mcard_2(), fk_column = b, parent_table = data_mcard_1())
  )
  expect_same(
    check_card_api(parent_table = data_mcard_1(), child_table = data_mcard_2(), a, b),
    check_card_api(parent_table = data_mcard_1(), a, child_table = data_mcard_2(), b),
    check_card_api(parent_table = data_mcard_1(), a, b, child_table = data_mcard_2()),
    check_card_api(child_table = data_mcard_2(), parent_table = data_mcard_1(), a, b),
    check_card_api(child_table = data_mcard_2(), a, parent_table = data_mcard_1(), b),
    check_card_api(child_table = data_mcard_2(), a, b, parent_table = data_mcard_1()),
    check_card_api(a, parent_table = data_mcard_1(), child_table = data_mcard_2(), b),
    check_card_api(a, parent_table = data_mcard_1(), b, child_table = data_mcard_2()),
    check_card_api(a, child_table = data_mcard_2(), parent_table = data_mcard_1(), b),
    check_card_api(a, child_table = data_mcard_2(), b, parent_table = data_mcard_1()),
    check_card_api(a, b, parent_table = data_mcard_1(), child_table = data_mcard_2()),
    check_card_api(a, b, child_table = data_mcard_2(), parent_table = data_mcard_1())
  )
  expect_same(
    check_card_api(parent_table = data_mcard_1(), child_table = data_mcard_2(), fk_column = b, a),
    check_card_api(parent_table = data_mcard_1(), child_table = data_mcard_2(), a, fk_column = b),
    check_card_api(parent_table = data_mcard_1(), fk_column = b, child_table = data_mcard_2(), a),
    check_card_api(parent_table = data_mcard_1(), fk_column = b, a, child_table = data_mcard_2()),
    check_card_api(parent_table = data_mcard_1(), a, child_table = data_mcard_2(), fk_column = b),
    check_card_api(parent_table = data_mcard_1(), a, fk_column = b, child_table = data_mcard_2()),
    check_card_api(child_table = data_mcard_2(), parent_table = data_mcard_1(), fk_column = b, a),
    check_card_api(child_table = data_mcard_2(), parent_table = data_mcard_1(), a, fk_column = b),
    check_card_api(child_table = data_mcard_2(), fk_column = b, parent_table = data_mcard_1(), a),
    check_card_api(child_table = data_mcard_2(), fk_column = b, a, parent_table = data_mcard_1()),
    check_card_api(child_table = data_mcard_2(), a, parent_table = data_mcard_1(), fk_column = b),
    check_card_api(child_table = data_mcard_2(), a, fk_column = b, parent_table = data_mcard_1()),
    check_card_api(fk_column = b, parent_table = data_mcard_1(), child_table = data_mcard_2(), a),
    check_card_api(fk_column = b, parent_table = data_mcard_1(), a, child_table = data_mcard_2()),
    check_card_api(fk_column = b, child_table = data_mcard_2(), parent_table = data_mcard_1(), a),
    check_card_api(fk_column = b, child_table = data_mcard_2(), a, parent_table = data_mcard_1()),
    check_card_api(fk_column = b, a, parent_table = data_mcard_1(), child_table = data_mcard_2()),
    check_card_api(fk_column = b, a, child_table = data_mcard_2(), parent_table = data_mcard_1()),
    check_card_api(a, parent_table = data_mcard_1(), child_table = data_mcard_2(), fk_column = b),
    check_card_api(a, parent_table = data_mcard_1(), fk_column = b, child_table = data_mcard_2()),
    check_card_api(a, child_table = data_mcard_2(), parent_table = data_mcard_1(), fk_column = b),
    check_card_api(a, child_table = data_mcard_2(), fk_column = b, parent_table = data_mcard_1()),
    check_card_api(a, fk_column = b, parent_table = data_mcard_1(), child_table = data_mcard_2()),
    check_card_api(a, fk_column = b, child_table = data_mcard_2(), parent_table = data_mcard_1())
  )
  expect_same(
    check_card_api(parent_table = data_mcard_1(), pk_column = a, data_mcard_2(), b),
    check_card_api(parent_table = data_mcard_1(), data_mcard_2(), pk_column = a, b),
    check_card_api(parent_table = data_mcard_1(), data_mcard_2(), b, pk_column = a),
    check_card_api(pk_column = a, parent_table = data_mcard_1(), data_mcard_2(), b),
    check_card_api(pk_column = a, data_mcard_2(), parent_table = data_mcard_1(), b),
    check_card_api(pk_column = a, data_mcard_2(), b, parent_table = data_mcard_1()),
    check_card_api(data_mcard_2(), parent_table = data_mcard_1(), pk_column = a, b),
    check_card_api(data_mcard_2(), parent_table = data_mcard_1(), b, pk_column = a),
    check_card_api(data_mcard_2(), pk_column = a, parent_table = data_mcard_1(), b),
    check_card_api(data_mcard_2(), pk_column = a, b, parent_table = data_mcard_1()),
    check_card_api(data_mcard_2(), b, parent_table = data_mcard_1(), pk_column = a),
    check_card_api(data_mcard_2(), b, pk_column = a, parent_table = data_mcard_1())
  )
  expect_same(
    check_card_api(parent_table = data_mcard_1(), pk_column = a, fk_column = b, data_mcard_2()),
    check_card_api(parent_table = data_mcard_1(), pk_column = a, data_mcard_2(), fk_column = b),
    check_card_api(parent_table = data_mcard_1(), fk_column = b, pk_column = a, data_mcard_2()),
    check_card_api(parent_table = data_mcard_1(), fk_column = b, data_mcard_2(), pk_column = a),
    check_card_api(parent_table = data_mcard_1(), data_mcard_2(), pk_column = a, fk_column = b),
    check_card_api(parent_table = data_mcard_1(), data_mcard_2(), fk_column = b, pk_column = a),
    check_card_api(pk_column = a, parent_table = data_mcard_1(), fk_column = b, data_mcard_2()),
    check_card_api(pk_column = a, parent_table = data_mcard_1(), data_mcard_2(), fk_column = b),
    check_card_api(pk_column = a, fk_column = b, parent_table = data_mcard_1(), data_mcard_2()),
    check_card_api(pk_column = a, fk_column = b, data_mcard_2(), parent_table = data_mcard_1()),
    check_card_api(pk_column = a, data_mcard_2(), parent_table = data_mcard_1(), fk_column = b),
    check_card_api(pk_column = a, data_mcard_2(), fk_column = b, parent_table = data_mcard_1()),
    check_card_api(fk_column = b, parent_table = data_mcard_1(), pk_column = a, data_mcard_2()),
    check_card_api(fk_column = b, parent_table = data_mcard_1(), data_mcard_2(), pk_column = a),
    check_card_api(fk_column = b, pk_column = a, parent_table = data_mcard_1(), data_mcard_2()),
    check_card_api(fk_column = b, pk_column = a, data_mcard_2(), parent_table = data_mcard_1()),
    check_card_api(fk_column = b, data_mcard_2(), parent_table = data_mcard_1(), pk_column = a),
    check_card_api(fk_column = b, data_mcard_2(), pk_column = a, parent_table = data_mcard_1()),
    check_card_api(data_mcard_2(), parent_table = data_mcard_1(), pk_column = a, fk_column = b),
    check_card_api(data_mcard_2(), parent_table = data_mcard_1(), fk_column = b, pk_column = a),
    check_card_api(data_mcard_2(), pk_column = a, parent_table = data_mcard_1(), fk_column = b),
    check_card_api(data_mcard_2(), pk_column = a, fk_column = b, parent_table = data_mcard_1()),
    check_card_api(data_mcard_2(), fk_column = b, parent_table = data_mcard_1(), pk_column = a),
    check_card_api(data_mcard_2(), fk_column = b, pk_column = a, parent_table = data_mcard_1())
  )
  expect_same(
    check_card_api(parent_table = data_mcard_1(), pk_column = a, child_table = data_mcard_2(), b),
    check_card_api(parent_table = data_mcard_1(), pk_column = a, b, child_table = data_mcard_2()),
    check_card_api(parent_table = data_mcard_1(), child_table = data_mcard_2(), pk_column = a, b),
    check_card_api(parent_table = data_mcard_1(), child_table = data_mcard_2(), b, pk_column = a),
    check_card_api(parent_table = data_mcard_1(), b, pk_column = a, child_table = data_mcard_2()),
    check_card_api(parent_table = data_mcard_1(), b, child_table = data_mcard_2(), pk_column = a),
    check_card_api(pk_column = a, parent_table = data_mcard_1(), child_table = data_mcard_2(), b),
    check_card_api(pk_column = a, parent_table = data_mcard_1(), b, child_table = data_mcard_2()),
    check_card_api(pk_column = a, child_table = data_mcard_2(), parent_table = data_mcard_1(), b),
    check_card_api(pk_column = a, child_table = data_mcard_2(), b, parent_table = data_mcard_1()),
    check_card_api(pk_column = a, b, parent_table = data_mcard_1(), child_table = data_mcard_2()),
    check_card_api(pk_column = a, b, child_table = data_mcard_2(), parent_table = data_mcard_1()),
    check_card_api(child_table = data_mcard_2(), parent_table = data_mcard_1(), pk_column = a, b),
    check_card_api(child_table = data_mcard_2(), parent_table = data_mcard_1(), b, pk_column = a),
    check_card_api(child_table = data_mcard_2(), pk_column = a, parent_table = data_mcard_1(), b),
    check_card_api(child_table = data_mcard_2(), pk_column = a, b, parent_table = data_mcard_1()),
    check_card_api(child_table = data_mcard_2(), b, parent_table = data_mcard_1(), pk_column = a),
    check_card_api(child_table = data_mcard_2(), b, pk_column = a, parent_table = data_mcard_1()),
    check_card_api(b, parent_table = data_mcard_1(), pk_column = a, child_table = data_mcard_2()),
    check_card_api(b, parent_table = data_mcard_1(), child_table = data_mcard_2(), pk_column = a),
    check_card_api(b, pk_column = a, parent_table = data_mcard_1(), child_table = data_mcard_2()),
    check_card_api(b, pk_column = a, child_table = data_mcard_2(), parent_table = data_mcard_1()),
    check_card_api(b, child_table = data_mcard_2(), parent_table = data_mcard_1(), pk_column = a),
    check_card_api(b, child_table = data_mcard_2(), pk_column = a, parent_table = data_mcard_1())
  )
  expect_same(
    check_card_api(
      parent_table = data_mcard_1(),
      pk_column = a,
      child_table = data_mcard_2(),
      fk_column = b
    ),
    check_card_api(
      parent_table = data_mcard_1(),
      pk_column = a,
      fk_column = b,
      child_table = data_mcard_2()
    ),
    check_card_api(
      parent_table = data_mcard_1(),
      child_table = data_mcard_2(),
      pk_column = a,
      fk_column = b
    ),
    check_card_api(
      parent_table = data_mcard_1(),
      child_table = data_mcard_2(),
      fk_column = b,
      pk_column = a
    ),
    check_card_api(
      parent_table = data_mcard_1(),
      fk_column = b,
      pk_column = a,
      child_table = data_mcard_2()
    ),
    check_card_api(
      parent_table = data_mcard_1(),
      fk_column = b,
      child_table = data_mcard_2(),
      pk_column = a
    ),
    check_card_api(
      pk_column = a,
      parent_table = data_mcard_1(),
      child_table = data_mcard_2(),
      fk_column = b
    ),
    check_card_api(
      pk_column = a,
      parent_table = data_mcard_1(),
      fk_column = b,
      child_table = data_mcard_2()
    ),
    check_card_api(
      pk_column = a,
      child_table = data_mcard_2(),
      parent_table = data_mcard_1(),
      fk_column = b
    ),
    check_card_api(
      pk_column = a,
      child_table = data_mcard_2(),
      fk_column = b,
      parent_table = data_mcard_1()
    ),
    check_card_api(
      pk_column = a,
      fk_column = b,
      parent_table = data_mcard_1(),
      child_table = data_mcard_2()
    ),
    check_card_api(
      pk_column = a,
      fk_column = b,
      child_table = data_mcard_2(),
      parent_table = data_mcard_1()
    ),
    check_card_api(
      child_table = data_mcard_2(),
      parent_table = data_mcard_1(),
      pk_column = a,
      fk_column = b
    ),
    check_card_api(
      child_table = data_mcard_2(),
      parent_table = data_mcard_1(),
      fk_column = b,
      pk_column = a
    ),
    check_card_api(
      child_table = data_mcard_2(),
      pk_column = a,
      parent_table = data_mcard_1(),
      fk_column = b
    ),
    check_card_api(
      child_table = data_mcard_2(),
      pk_column = a,
      fk_column = b,
      parent_table = data_mcard_1()
    ),
    check_card_api(
      child_table = data_mcard_2(),
      fk_column = b,
      parent_table = data_mcard_1(),
      pk_column = a
    ),
    check_card_api(
      child_table = data_mcard_2(),
      fk_column = b,
      pk_column = a,
      parent_table = data_mcard_1()
    ),
    check_card_api(
      fk_column = b,
      parent_table = data_mcard_1(),
      pk_column = a,
      child_table = data_mcard_2()
    ),
    check_card_api(
      fk_column = b,
      parent_table = data_mcard_1(),
      child_table = data_mcard_2(),
      pk_column = a
    ),
    check_card_api(
      fk_column = b,
      pk_column = a,
      parent_table = data_mcard_1(),
      child_table = data_mcard_2()
    ),
    check_card_api(
      fk_column = b,
      pk_column = a,
      child_table = data_mcard_2(),
      parent_table = data_mcard_1()
    ),
    check_card_api(
      fk_column = b,
      child_table = data_mcard_2(),
      parent_table = data_mcard_1(),
      pk_column = a
    ),
    check_card_api(
      fk_column = b,
      child_table = data_mcard_2(),
      pk_column = a,
      parent_table = data_mcard_1()
    )
  )
})

test_that("check_cardinality_...() API errors", {
  skip_if_src_not("df")

  expect_snapshot({
    check_card_api(data_mcard_1(), a, data_mcard_2(), b)
  })
  expect_snapshot(error = TRUE, {
    check_card_api(data_mcard_1(), data_mcard_2(), x_select = a, y_select = c)
  })
})

test_that("check_cardinality_...() functions are checking the cardinality correctly?", {
  #  expecting silent: ------------------------------------------------------

  expect_silent(check_cardinality_0_n(
    data_card_1(),
    data_card_3(),
    x_select = a,
    y_select = c(a = c)
  ))

  expect_silent(check_cardinality_1_n(
    data_card_1(),
    data_card_3(),
    x_select = a,
    y_select = c(a = c)
  ))

  expect_silent(check_cardinality_1_1(
    data_card_1(),
    data_card_3(),
    x_select = a,
    y_select = c(a = c)
  ))

  expect_silent(check_set_equality(data_card_1(), data_card_3(), x_select = a, y_select = c(a = c)))

  expect_silent(check_cardinality_0_n(
    data_card_5(),
    data_card_4(),
    x_select = a,
    y_select = c(a = c)
  ))

  expect_silent(check_cardinality_0_1(
    data_card_5(),
    data_card_6(),
    x_select = a,
    y_select = c(a = c)
  ))

  # scenarios for examine_cardinality() -------------------------------------

  expect_identical(
    examine_cardinality(data_card_8(), data_card_2(), x_select = c, y_select = c(c = a)),
    "injective mapping (child: 0 or 1 -> parent: 1)"
  )

  expect_identical(
    examine_cardinality(data_card_5(), data_card_4(), x_select = a, y_select = c(a = c)),
    "surjective mapping (child: 1 to n -> parent: 1)"
  )

  expect_identical(
    examine_cardinality(data_card_8(), data_card_4(), x_select = c, y_select = c),
    "generic mapping (child: 0 to n -> parent: 1)"
  )

  expect_identical(
    examine_cardinality(data_card_1(), data_card_3(), x_select = a, y_select = c(a = c)),
    "bijective mapping (child: 1 -> parent: 1)"
  )

  # expect specific errors and sometimes specific output due to errors ---------------

  expect_snapshot({
    expect_dm_error(
      check_cardinality_0_n(
        data_card_1(),
        data_card_2(),
        x_select = a,
        y_select = a
      ),
      class = "not_subset_of"
    )

    expect_dm_error(
      check_cardinality_1_1(data_card_5(), data_card_4(), x_select = a, y_select = c(a = c)),
      class = "not_bijective"
    )

    expect_dm_error(
      check_cardinality_1_1(data_card_4(), data_card_5(), x_select = c, y_select = c(c = a)),
      class = "not_unique_key"
    )

    expect_dm_error(
      check_cardinality_1_1(data_card_4(), data_card_1(), x_select = c, y_select = c(c = a)),
      class = "not_unique_key"
    )

    expect_dm_error(
      check_cardinality_0_1(data_card_1(), data_card_4(), x_select = a, y_select = c(a = c)),
      class = "not_injective"
    )

    expect_dm_error(
      check_cardinality_0_n(data_card_4(), data_card_1(), x_select = c, y_select = c(c = a)),
      class = "not_unique_key"
    )

    expect_dm_error(
      check_cardinality_1_1(data_card_4(), data_card_1(), x_select = c, y_select = c(c = a)),
      class = "not_unique_key"
    )

    expect_dm_error(
      check_cardinality_1_1(data_card_1(), data_card_4(), x_select = a, y_select = c(a = c)),
      class = "not_bijective"
    )
  })
})


# tests for compound keys -------------------------------------------------

test_that("check_cardinality_...() functions are supporting compound keys", {
  # successes
  expect_silent(check_cardinality_0_n(
    data_card_1(),
    data_card_11(),
    x_select = c(a, b),
    y_select = c(a, b)
  ))
  expect_silent(check_cardinality_1_n(
    data_card_1(),
    data_card_12(),
    x_select = c(a, b),
    y_select = c(a, b)
  ))
  # compute(): Can't open the same table twice on MySQL
  expect_silent(check_cardinality_1_1(
    data_card_1(),
    suppress_mssql_message(compute(data_card_1())),
    x_select = c(a, b),
    y_select = c(a, b)
  ))
  expect_silent(check_set_equality(
    data_card_12(),
    data_card_1(),
    x_select = c(a, b),
    y_select = c(a, b)
  ))
  expect_silent(check_cardinality_0_1(
    data_card_1(),
    data_card_11(),
    x_select = c(a, b),
    y_select = c(a, b)
  ))

  # scenarios for examine_cardinality() -------------------------------------

  expect_identical(
    examine_cardinality(data_card_1(), data_card_11(), x_select = c(a, b), y_select = c(a, b)),
    "injective mapping (child: 0 or 1 -> parent: 1)"
  )

  expect_identical(
    examine_cardinality(data_card_1(), data_card_12(), x_select = c(a, b), y_select = c(a, b)),
    "surjective mapping (child: 1 to n -> parent: 1)"
  )

  expect_identical(
    examine_cardinality(data_card_13(), data_card_12(), x_select = c(b, a), y_select = c(b, a)),
    "generic mapping (child: 0 to n -> parent: 1)"
  )

  expect_identical(
    # compute(): Can't open the same table twice on MySQL
    examine_cardinality(
      data_card_1(),
      suppress_mssql_message(compute(data_card_1())),
      x_select = c(b, a),
      y_select = c(b, a)
    ),
    "bijective mapping (child: 1 -> parent: 1)"
  )

  # expect specific errors and sometimes specific output due to errors ---------------

  expect_snapshot({
    expect_dm_error(
      check_cardinality_0_n(
        data_card_1(),
        data_card_2(),
        x_select = c(a, b),
        y_select = c(a, b)
      ),
      class = "not_subset_of"
    )

    expect_dm_error(
      check_cardinality_1_1(data_card_1(), data_card_12(), x_select = c(a, b), y_select = c(a, b)),
      class = "not_bijective"
    )

    expect_dm_error(
      check_cardinality_1_1(data_card_12(), data_card_1(), x_select = c(a, b), y_select = c(a, b)),
      class = "not_unique_key"
    )

    expect_dm_error(
      check_cardinality_0_1(data_card_1(), data_card_12(), x_select = c(b, a), y_select = c(b, a)),
      class = "not_injective"
    )
  })
})
