





context(desc = "Testing layering")

testthat::skip_on_cran()
models <- c("X -> Y",
						"X -> Y <- M",
						"C -> Y <- M; X -> Y ")

restrictions <- c("Y[X=0] == 1", "Y[X=0, M = 0] > Y[X=1, M = 1]",
                  "Y[X = 0, C = 0, M= 0] == 1")


for(i in length(models)){
	testthat::test_that(

		desc = "Layering confounds and restrictions work in both directions",

		code = {

			model1 <- make_model(models[i]) |>
			  set_confound("X <-> Y") |>
				set_restrictions(restrictions[i])

			model2 <- make_model(models[i]) |>
				set_restrictions(restrictions[i]) |>
				set_confound("X <-> Y")

			expect_equal(nrow(get_causal_types(model1)),
			             nrow(get_causal_types(model2)))


			model1 <- make_model(models[i]) |>
			  set_confound("X <-> Y") |>
				set_restrictions(restrictions[i], keep = TRUE)

			model2 <- make_model(models[i]) |>
				set_restrictions(restrictions[i], keep = TRUE) |>
			  set_confound("X <-> Y")

			expect_equal(nrow(get_causal_types(model1)),
			             nrow(get_causal_types(model2)))

		}
	)
}






testthat::test_that(

	desc = "Layering restrictions and P matrix",

	code = {


		# Removing columns from P after restrictions
		model_a <- make_model("X->Y") |>
			set_parameter_matrix() |>
			set_restrictions("X[]==1")

		model_b <- make_model("X->Y") |>
			set_restrictions("X[]==1") |>
			set_parameter_matrix()

		expect_equal(ncol(model_a$P), ncol(model_b$P))
		})


