test_that("no message-correct", { q <- question( "test", answer("A", correct = TRUE), answer("B", correct = FALSE), correct = "test-correct", incorrect = "test-incorrect" ) ans <- question_is_correct(q, c("A")) out <- question_messages(q, ans$messages, ans$correct, (!isTRUE(q$allow_retry)) || ans$correct) expect_s3_class(out, "shiny.tag.list") expect_equivalent(as.character(out[[1]]$children[[1]]), "test-correct") expect_true(is.null(out$children[[2]])) expect_true(is.null(out$children[[3]])) }) test_that("no message-incorrect", { q <- question( "test", answer("A", correct = TRUE), answer("B", correct = FALSE), correct = "test-correct", incorrect = "test-incorrect" ) ans <- question_is_correct(q, c("B")) out <- question_messages(q, ans$messages, ans$correct, (!isTRUE(q$allow_retry)) || ans$correct) expect_s3_class(out, "shiny.tag.list") expect_equivalent(as.character(out[[1]]$children[[1]]), "test-incorrect") expect_true(is.null(out$children[[2]])) expect_true(is.null(out$children[[3]])) }) test_that("all messages-correct", { q <- question( "test", answer("A", correct = TRUE, message = "msg **1**"), answer("B", correct = FALSE, message = "msg _2_"), correct = "test-correct", incorrect = "test-incorrect", message = "test-message", post_message = "test-post" ) ans <- question_is_correct(q, c("A")) out <- question_messages(q, ans$messages, ans$correct, (!isTRUE(q$allow_retry)) || ans$correct) expect_s3_class(out, "shiny.tag.list") expect_equivalent(as.character(out[[1]]$children[[1]][[1]][[1]]), "test-correct") expect_equivalent(as.character(out[[1]]$children[[1]][[1]][[3]]), "msg 1") expect_equivalent(as.character(out[[2]]$children[[1]]), "test-message") expect_equivalent(as.character(out[[3]]$children[[1]]), "test-post") }) test_that("all messages-incorrect", { q <- question( "test", answer("A", correct = TRUE, message = "msg **1**"), answer("B", correct = FALSE, message = "msg _2_"), correct = "test-correct", incorrect = "test-incorrect", message = "test-message", post_message = "test-post" ) ans <- question_is_correct(q, c("B")) out <- question_messages(q, ans$messages, ans$correct, (!isTRUE(q$allow_retry)) || ans$correct) expect_s3_class(out, "shiny.tag.list") expect_equivalent(as.character(out[[1]]$children[[1]][[1]][[1]]), "test-incorrect") expect_equivalent(as.character(out[[1]]$children[[1]][[1]][[3]]), "msg 2") expect_equivalent(as.character(out[[2]]$children[[1]]), "test-message") expect_equivalent(as.character(out[[3]]$children[[1]]), "test-post") }) test_that("custom message", { q <- question( "test", answer("A", correct = TRUE, message = htmltools::tags$div("_Test_")), answer("B", correct = FALSE), correct = "test-correct", incorrect = "test-incorrect" ) ans <- question_is_correct(q, c("A")) out <- question_messages(q, ans$messages, ans$correct, (!isTRUE(q$allow_retry)) || ans$correct) expect_s3_class(out, "shiny.tag.list") expect_equivalent(as.character(out[[1]]$children[[1]][[1]][[1]]), "test-correct") expect_equivalent(as.character(out[[1]]$children[[1]][[1]][[3]]$children), "_Test_") expect_true(is.null(out$children[[2]])) expect_true(is.null(out$children[[3]])) }) test_that("answer options must have unique values (option)", { expect_error( answer_values(list(answers = list( answer("same"), answer("same") ))) ) }) test_that("answer functions", { # Test various ways of specifying the answer function answer <- answer_fn(identity, label = "test `answer_fn()`") expect_true(eval(parse(text = answer$value))(TRUE)) # test properties on this first answer object expect_equal(answer$type, "function") expect_equal(answer$label, quiz_text("test `answer_fn()`")) expect_null(answer$correct) expect_null(answer$message) answer <- answer_fn(function(x) identity(x)) expect_true(eval(parse(text = answer$value))(TRUE)) answer <- answer_fn(~ identity(.x)) expect_true(eval(parse(text = answer$value))(TRUE)) answer <- answer_fn("identity") expect_true(eval(parse(text = answer$value))(TRUE)) expect_error(answer_fn(function() "FAIL")) expect_error(answer_fn("FAIL")) answer <- local({ # PASS won't be defined when we evaluate the re-parsed fn body PASS <- function(x) TRUE answer_fn("PASS") }) expect_true(eval(parse(text = answer$value))()) }) test_that("answer functions: filtering and splitting", { q <- question_text( "test question", answer("apple", TRUE, "correct"), answer_fn(function(x) "F1", "f1"), answer("banana", FALSE, "incorrect"), answer_fn(~ "F2", "f2"), answer("mango", FALSE, "also incorrect") ) expect_equal( answer_type_is_function(q$answers), c(FALSE, TRUE, FALSE, TRUE, FALSE) ) expect_equal(length(answers_split_type(q$answers)[["literal"]]), 3L) expect_equal(length(answers_split_type(q$answers)[["function"]]), 2L) expect_equal( unlist(answer_labels(q)), c("apple", "f1", "banana", "f2", "mango") ) expect_equal( unlist(answer_labels(q, exclude_answer_fn = TRUE)), c("apple", "banana", "mango") ) expect_equal( unlist(answer_values(q, exclude_answer_fn = TRUE)), c("apple", "banana", "mango") ) q_labels <- unlist(answer_values(q)) expect_match(q_labels[2], "function.+F1") expect_match(q_labels[4], "function.+F2") }) test_that("mark_as(), correct(), incorrect()", { expect_equal( mark_as(TRUE, "correct message"), correct("correct message") ) expect_equal( mark_as(FALSE, "incorrect message"), incorrect("incorrect message") ) expect_s3_class(mark_as(TRUE, "correct"), "learnr_mark_as") expect_s3_class(correct("correct"), "learnr_mark_as") expect_s3_class(incorrect("incorrect"), "learnr_mark_as") })