tests/testthat/tests.R

if (rlang::is_installed(c("withr", "testthat"))) {

  # Imports that will be used later  ####
  # Must be outside of testthat, so that they can be referred to later
  suppressWarnings({
    otree_2_2_4 <- import_otree(
      del_empty = TRUE,
      path = testthat::test_path("testdata", "exp_data_2.2.4"),
      onlybots = FALSE,
      csv = TRUE,
      info = FALSE)

    otree_5_4_0 <- import_otree(
      del_empty = TRUE,
      path = testthat::test_path("testdata", "exp_data_5.4.0"),
      onlybots = FALSE,
      csv = TRUE,
      info = FALSE)
    # Alternative: # file.path(".", "exp_data_5.4.0"),

    otree_5_4_0_non_unique <- otree_5_4_0
    otree_5_4_0 <- delete_duplicate(otree_5_4_0)

    otree_old_one <- import_otree(
      del_empty = TRUE,
      path = testthat::test_path("testdata", "old_one"),
      onlybots = FALSE,
      csv = TRUE,
      info = FALSE)
    # Alternative: # file.path(".", "old_one"),

    otree_all <- import_otree(
      del_empty = TRUE,
      onlybots = FALSE,
      csv = TRUE,
      info = FALSE)

    otree_new_empty <- import_otree(
      del_empty = FALSE,
      path = testthat::test_path("testdata", "exp_data"),
      onlybots = FALSE,
      csv = TRUE,
      info = FALSE)
    # Alternative:  # file.path(".", "exp_data"),

  })

  # App time   ####
  testthat::test_that("App time - problematic first app old and new", {

    otree2 <- otree_all
    # Delete duplicates
    otree2$Time <- otree2$Time[!duplicated(otree2$Time), ]

    # Run function
    output <- apptime(otree2,
                      "start",
                      combine = TRUE)

    testthat::expect_true(
      setequal(names(output),
               c("mean_duration", "min_duration", "max_duration",
                 "single_durations", "warnings", "first_app_one_page",
                 "messages")))

  })

  testthat::test_that("App time - problematic first app old and new", {

    otree2 <- otree_all
    # Delete duplicates
    otree2$Time <- otree2$Time[!duplicated(otree2$Time), ]

    # Run function
    output <- apptime(otree2,
                      combine = TRUE)

    testthat::expect_true(
      setequal(names(output$start),
               c("mean_duration", "min_duration", "max_duration",
                 "single_durations", "warnings", "first_app_one_page",
                 "messages")))

  })

  testthat::test_that("App time - all duplicate participants all apps", {
    # Prepare data (make duplicate data)
    otree2 <- otree_5_4_0
    otree2$Time <- rbind(otree2$Time, otree2$Time)

    # Run function
    output <- apptime(otree2)

    # Test
    test <- grepl(paste0("Durations not calculated. ",
                         "There are duplicate data in your Time data frame."),
                  output)
    testthat::expect_true(test)
  })

  testthat::test_that("App time - one duplicate participant", {
    # Prepare data (make duplicate data)
    otree2 <- otree_5_4_0
    person <- otree2$all_apps_wide$participant.code[
      otree2$all_apps_wide$participant._current_app_name == "survey"][1L]
    otree2$Time <- rbind(otree2$Time,
                         otree2$Time[otree2$Time$participant_code == person, ])

    # Run function
    output <- apptime(otree2)

    # Test
    test3 <- setequal(names(output$start),
                      c("mean_duration",
                        "min_duration",
                        "max_duration",
                        "single_durations",
                        "duplicate_participants",
                        "messages"))
    test4 <- length(output$start$messages) == 1L
    test1 <- setequal(names(output$chatapp),
                      c("mean_duration",
                        "min_duration",
                        "max_duration",
                        "single_durations",
                        "warnings",
                        "duplicate_participants",
                        "messages"))
    test2 <- length(output$chatapp$messages) == 2
    test5 <- setequal(names(output$dictator),
                      c("mean_duration",
                        "min_duration",
                        "max_duration",
                        "single_durations",
                        "duplicate_participants",
                        "warnings",
                        "messages"))
    test6 <- length(output$dictator$messages) == 2
    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6)))

    # Test if participant is in list duplicate_participants
    test2 <- output$dictator$duplicate_participants == person
    test2 <- output$start$duplicate_participants == person
    test3 <- output$chatapp$duplicate_participants == person
    test4 <- output$survey$duplicate_participants == person
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("App time - one app oTree old", {
    # Prepare data
    otree2 <- otree_2_2_4

    # Run function
    output <- apptime(otree2,
                      apps = "start",
                      sinfo = "session_id")

    # Test
    testthat::expect_true(setequal(
      names(output), "messages"))

    testthat::expect_true(
      grepl(paste0("Durations not calculated. If the first app only has one ",
                   "page, the indices for the first"),
            output["messages"]))
  })

  testthat::test_that("App time - one app durations not calculated", {
    # Prepare data
    otree2 <- otree_5_4_0
    # Keep only cases that didn't make it to the app
    delcases <- otree2$all_apps_wide$participant.code[
      otree2$all_apps_wide$participant._current_app_name == "survey"]

    otree2 <- delete_cases(otree2,
                           delcases,
                           reason = "test")
    # Run function
    output <- apptime(otree2,
                      apps = "survey")

    # Test
    test1 <- setequal(
      names(output), "messages")

    test2 <- grepl("Durations not calculated. Check your data before rerunning the function.",
                   output[["messages"]])

    testthat::expect_true(all(c(test1, test2)))
  })

  testthat::test_that("App time - several apps firstappproblemparticipant", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Delete rows to make the first app to only have one page
    otree2$Time <- otree2$Time[otree2$Time$page_index != 0L, ]

    # Run function
    output <- apptime(otree2)

    # Test for problematic first app
    test2 <- setequal(names(output$start),
                      "messages")

    test3 <- expect_true(grepl(
      pattern = "If the first app only has one page, the indices",
      x = output$start$message))

    testthat::expect_true(all(c(test2, test3)))

    # Test structure
    testthat::expect_output(str(output$start), "List of 1")
    testthat::expect_true(all(
      c("messages") %in%
        names(output$start)))

    testthat::expect_output(str(output$chatapp), "List of 6")
    testthat::expect_true(all(
      c("mean_duration", "min_duration", "max_duration",
        "single_durations", "warnings", "messages") %in% names(output$chatapp)))
    testthat::expect_output(str(output$dictator), "List of 6")
    testthat::expect_output(str(output$survey), "List of 6")

    # Test the others
    # Important. In new oTree, there is no need for a first-app-one-stage
    # warning, because there is a index number 0!
    # Also: firstappwarning is also not shown for new oTree.
    test1 <- !is.null(output$dictator$mean_duration) &
      !is.na(output$dictator$mean_duration)
    test2 <- !is.null(output$dictator$min_duration) &
      !is.na(output$dictator$min_duration)
    test3 <- !is.null(output$dictator$max_duration) &
      !is.na(output$dictator$max_duration)
    test4 <- (nrow(output$dictator$single_durations) +
                length(output$dictator$warnings)) ==
      nrow(otree2$dictator) / 3L

    # Test if the values and the single_durations align
    test5 <- round(output$dictator$min_duration, 2L) ==
      round(min(output$dictator$single_durations$duration), 2L)
    test6 <- round(output$dictator$max_duration, 2L) ==
      round(max(output$dictator$single_durations$duration), 2L)
    test7 <- round(output$dictator$mean_duration, 2L) ==
      round(mean(output$dictator$single_durations$duration), 2L)

    # Run
    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6, test7)))
  })

  testthat::test_that("App time - all apps old oTree specified person", {
    # Prepare data
    otree2 <- otree_2_2_4
    otree2 <- make_ids(otree2)
    person <- otree_2_2_4$Time$participant__code[
      otree_2_2_4$Time$app_name == "survey"][1L]

    # Run function
    output <- apptime(otree2,
                      pcode = person,
                      sinfo = "session_id")

    # Test
    test1 <- is.numeric(output$chatapp)
    test2 <- is.numeric(output$dictator)
    test3 <- is.numeric(output$start) # NA

    testthat::expect_true(all(c(test1, test2, test3)))
    testthat::expect_output(str(output), "List of 4")
  })

  testthat::test_that("App time - all apps, seconds = FALSE", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function
    output <- apptime(otree2,
                      sinfo = NULL)

    # Test
    testthat::expect_output(str(output$start), "List of 4")  # No warnings

    testthat::expect_output(str(output$chatapp), "List of 6")
    testthat::expect_true(all(
      c("mean_duration", "min_duration", "max_duration",
        "single_durations", "warnings", "messages") %in% names(output$chatapp)))
    testthat::expect_true(all(
      c("mean_duration", "min_duration", "max_duration",
        "single_durations", "warnings", "messages") %in% names(output$chatapp)))

    testthat::expect_output(str(output$dictator), "List of 6")
    testthat::expect_output(str(output$survey), "List of 6")

    # Important. In new oTree, there is no need for a first-app-one-stage
    # warning, because there is a index number 0!
    # Also: firstappwarning is also not shown for new oTree.
    test1 <- !is.null(output$dictator$mean_duration) &
      !is.na(output$dictator$mean_duration)
    test2 <- !is.null(output$dictator$min_duration) &
      !is.na(output$dictator$min_duration)
    test3 <- !is.null(output$dictator$max_duration) &
      !is.na(output$dictator$max_duration)
    test4 <- (nrow(output$dictator$single_durations) +
                length(output$dictator$warnings)) ==
      nrow(otree2$dictator) / 3L

    # Test if the values and the single_durations align
    test5 <- round(output$dictator$min_duration, 2L) ==
      round(min(output$dictator$single_durations$duration), 2L)
    test6 <- round(output$dictator$max_duration, 2L) ==
      round(max(output$dictator$single_durations$duration), 2L)
    test7 <- round(output$dictator$mean_duration, 2L) ==
      round(mean(output$dictator$single_durations$duration), 2L)

    # Test for exact values
    testthat::expect_true(output$chatapp$min_duration == 0.08)
    testthat::expect_true(output$chatapp$max_duration == 0.27)
    testthat::expect_true(output$chatapp$mean_duration == 0.21)

    testthat::expect_true(output$start$min_duration == 0.02)
    testthat::expect_true(output$start$max_duration == 0.15)
    testthat::expect_true(output$start$mean_duration == 0.07)

    testthat::expect_true(output$survey$min_duration == 0.23)
    testthat::expect_true(output$survey$max_duration == 0.37)
    testthat::expect_true(output$survey$mean_duration == 0.28)

    # Run
    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6, test7)))

    # Test warnings
    testthat::expect_true(
      grepl(pattern =
              "or some participants, no duration could be calculated",
            x = output$chatapp$message))

    testthat::expect_true(exists("warnings", output$chatapp))

    test1 <- length(output$start$single_durations$participant) == 8L

    # Warnings not in durations!
    test2 <- !any(output$chatapp$warnings %in%
                    output$chatapp$single_durations$participant)
    test3 <- !any(output$dictator$warnings %in%
                    output$dictator$single_durations$participant)
    test4 <- !any(output$survey$warnings %in%
                    output$survey$single_durations$participant)

    # No duplicates in durations
    test5 <- !anyDuplicated(output$start$single_durations$participant)
    test6 <- !anyDuplicated(output$chatapp$single_durations$participant)
    test7 <- !anyDuplicated(output$dictator$single_durations$participant)
    test8 <- !anyDuplicated(output$survey$single_durations$participant)

    # No duplicates in warning
    test9 <- !anyDuplicated(output$chatapp$warnings)
    test10 <- !anyDuplicated(output$dictator$warnings)
    test11 <- !anyDuplicated(output$survey$warnings)

    # Run
    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6, test7, test8,
                                test9, test10, test11)))
  })

  testthat::test_that("App time - all apps, without session info", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function
    output <- apptime(otree2)

    # Test
    testthat::expect_output(str(output), "List of 4")
    # Test fi values are there
    test1 <- !is.null(output$dictator$mean_duration) &
      !is.na(output$dictator$mean_duration)
    test2 <- !is.null(output$dictator$min_duration) &
      !is.na(output$dictator$min_duration)
    test3 <- !is.null(output$dictator$max_duration) &
      !is.na(output$dictator$max_duration)
    test4 <-
      (nrow(output$dictator$single_durations) +
         length(output$dictator$warnings)) == nrow(otree2$dictator) / 3L

    # Test if the values and the single_durations align
    test5 <- round(output$dictator$min_duration, 2L) ==
      round(min(output$dictator$single_durations$duration), 2L)
    test6 <- round(output$dictator$max_duration, 2L) ==
      round(max(output$dictator$single_durations$duration), 2L)
    test7 <- round(output$dictator$mean_duration, 2L) ==
      round(mean(output$dictator$single_durations$duration), 2L)

    # Test warnings
    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6, test7)))

    # Test for exact values
    testthat::expect_true(output$chatapp$min_duration == 0.08)
    testthat::expect_true(output$chatapp$max_duration == 0.27)
    testthat::expect_true(output$chatapp$mean_duration == 0.21)

    testthat::expect_true(output$start$min_duration == 0.02)
    testthat::expect_true(output$start$max_duration == 0.15)
    testthat::expect_true(output$start$mean_duration == 0.07)

    testthat::expect_true(output$survey$min_duration == 0.23)
    testthat::expect_true(output$survey$max_duration == 0.37)
    testthat::expect_true(output$survey$mean_duration == 0.28)

    # Test more warnings
    testthat::expect_true(
      grepl(pattern =
              "or some participants, no duration could be calculated",
            x = output$chatapp$message))

    testthat::expect_true(exists("warnings", output$chatapp))

    test1 <- length(output$start$single_durations$participant) == 8L

    # Warnings not in durations!
    test2 <- !any(output$chatapp$warnings %in%
                    output$chatapp$single_durations$participant)
    test3 <- !any(output$dictator$warnings %in%
                    output$dictator$single_durations$participant)
    test4 <- !any(output$survey$warnings %in%
                    output$survey$single_durations$participant)

    # No duplicates in durations
    test5 <- !anyDuplicated(output$start$single_durations$participant)
    test6 <- !anyDuplicated(output$chatapp$single_durations$participant)
    test7 <- !anyDuplicated(output$dictator$single_durations$participant)
    test8 <- !anyDuplicated(output$survey$single_durations$participant)

    # No duplicates in warning
    test9 <- !anyDuplicated(output$chatapp$warnings)
    test10 <- !anyDuplicated(output$dictator$warnings)
    test11 <- !anyDuplicated(output$survey$warnings)

  })

  testthat::test_that("App time - all apps, seconds = TRUE", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function
    output_second <- apptime(otree2, seconds = TRUE, digits = 4L)
    output_minutes <- apptime(otree2, seconds = FALSE, digits = 4L)

    # Test
    testthat::expect_output(str(output_second), "List of 4")

    test1 <-
      round(output_minutes$dictator$mean_duration * 60L, 2L) ==
      round(output_second$dictator$mean_duration, 2L)
    test2 <-
      round(output_minutes$dictator$min_duration  * 60L, 2L) ==
      round(output_second$dictator$min_duration, 2L)
    test3 <-
      round(output_minutes$dictator$max_duration * 60L, 2L) ==
      round(output_second$dictator$max_duration, 2L)
    testthat::expect_true(all(c(test1, test2, test3)))

    # Test for exact values
    testthat::expect_true(
      output_second$chatapp$min_duration == round(0.0833 * 60L))
    testthat::expect_true(
      output_second$chatapp$max_duration == round(0.2667 * 60L))
    testthat::expect_true(
      output_second$chatapp$mean_duration == 12.5)

    testthat::expect_true(
      output_second$start$min_duration == round(0.0167 * 60L))
    testthat::expect_true(
      output_second$start$max_duration == round(0.15 * 60L))
    testthat::expect_true(
      output_second$start$mean_duration == round(0.0667 * 60L))

    testthat::expect_true(
      output_second$survey$min_duration == round(0.2333 * 60L))
    testthat::expect_true(
      output_second$survey$max_duration == round(0.3667 * 60L))
    testthat::expect_true(
      output_second$survey$mean_duration == 16.75)

    testthat::expect_true(output_minutes$chatapp$min_duration == 0.0833)
    testthat::expect_true(output_minutes$chatapp$max_duration == 0.2667)
    testthat::expect_true(output_minutes$chatapp$mean_duration == 0.2084)

    testthat::expect_true(output_minutes$start$min_duration == 0.0167)
    testthat::expect_true(output_minutes$start$max_duration == 0.15)
    testthat::expect_true(output_minutes$start$mean_duration == 0.0667)

    testthat::expect_true(output_minutes$survey$min_duration == 0.2333)
    testthat::expect_true(output_minutes$survey$max_duration == 0.3667)
    testthat::expect_true(output_minutes$survey$mean_duration == 0.2792)
  })

  testthat::test_that("App time - all apps, old oTree", {
    # Prepare data
    otree2 <- otree_2_2_4
    otree2 <- make_ids(otree2)

    # Run function
    output <- apptime(otree2,
                      sinfo = "session_id")

    # Test structure
    testthat::expect_output(str(output), "List of 4")

    # Start
    testthat::expect_output(str(output$start), "List of 1")
    testthat::expect_true(setequal(
      "messages", names(output$start)))

    # Dictator
    testthat::expect_output(str(output$dictator), "List of 6")
    testthat::expect_true(all(
      c("mean_duration", "min_duration",
        "max_duration", "single_durations",
        "messages", "warnings") %in% names(output$dictator)))
    # Survey
    testthat::expect_output(str(output$survey), "List of 6")
    testthat::expect_true(all(
      c("mean_duration", "min_duration",
        "max_duration", "single_durations",
        "messages", "warnings") %in% names(output$survey)))
    # Chatapp
    testthat::expect_output(str(output$chatapp), "List of 6")
    testthat::expect_true(all(
      c("mean_duration", "min_duration",
        "max_duration", "single_durations",
        "messages", "warnings") %in% names(output$chatapp)))

    # Further tests
    testthat::expect_true(setequal(names(output$start),
                                   "messages"))
    test1 <- grepl(pattern = "Durations not calculated",
                   x = output$start$messages)

    test2 <- !is.vector(output$start$first_app_one_page)

    # Dictator
    test3 <- !is.null(output$dictator$mean_duration) &
      !is.na(output$dictator$mean_duration)
    test4 <- !is.null(output$dictator$min_duration) &
      !is.na(output$dictator$min_duration)
    test5 <- !is.null(output$dictator$max_duration) &
      !is.na(output$dictator$max_duration)
    # Such tests do not work in the old oTree,
    # because not all persons are also in the time file.
    # test4 <- (nrow(output$dictator$single_durations) +
    # length(output$dictator$warnings)) == nrow(otree2$dictator) / 3
    # Test if the values and the single_durations align

    # Min, max, mean durations according to single_durations frame
    test6 <- round(output$dictator$min_duration, 2L) ==
      round(min(output$dictator$single_durations$duration), 2L)
    test7 <- round(output$dictator$max_duration, 2L) ==
      round(max(output$dictator$single_durations$duration), 2L)
    test8 <- round(output$dictator$mean_duration, 2L) ==
      round(mean(output$dictator$single_durations$duration), 2L)
    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6, test7, test8)))

    # Specific values
    testthat::expect_true(output$chatapp$min_duration  == 0.22)
    testthat::expect_true(output$chatapp$max_duration == 1.17)
    testthat::expect_true(output$chatapp$mean_duration == 0.44)

    testthat::expect_true(output$dictator$min_duration  == 0.33)
    testthat::expect_true(output$dictator$max_duration == 1.88)
    testthat::expect_true(output$dictator$mean_duration == 1.02)

    # Test more warnings
    testthat::expect_true(
      grepl(pattern =
              "or some participants, no duration could be calculated",
            x = output$chatapp$message))

    testthat::expect_true(exists("warnings", output$chatapp))

    # Dropouts in first app are not in Time frame!
    participants_who_left_start <-
      nrow(otree2$start[
        otree2$start$participant._current_app_name != "start", ])

    participants_who_didnt_leaf_start <-
      nrow(otree2$start[
        otree2$start$participant._current_app_name == "start", ])

    testthat::expect_true(length(unique(otree2$Time$participant__code)) ==
                            participants_who_left_start)
    testthat::expect_false(any(participants_who_didnt_leaf_start %in%
                                   unique(otree2$Time$participant__code)))

    # Warnings not in durations!
    test2 <- !any(output$chatapp$warnings %in%
                    output$chatapp$single_durations$participant)
    test3 <- !any(output$dictator$warnings %in%
                    output$dictator$single_durations$participant)
    test4 <- !any(output$survey$warnings %in%
                    output$survey$single_durations$participant)
    testthat::expect_true(all(c(test2, test3, test4)))

    # No duplicates in durations
    test5 <- !anyDuplicated(output$start$single_durations$participant)
    test6 <- !anyDuplicated(output$chatapp$single_durations$participant)
    test7 <- !anyDuplicated(output$dictator$single_durations$participant)
    test8 <- !anyDuplicated(output$survey$single_durations$participant)
    testthat::expect_true(all(c(test5, test6, test7, test8)))

    # No duplicates in warnings
    test9 <- !anyDuplicated(output$chatapp$warnings)
    test10 <- !anyDuplicated(output$dictator$warnings)
    test11 <- !anyDuplicated(output$survey$warnings)
    testthat::expect_true(all(c(test9, test10, test11)))
  })

  testthat::test_that("App time - one app firstappproblemparticipant", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Delete rows to make the first app to only have one page
    otree2$Time <- otree2$Time[otree2$Time$page_index != 0L, ]

    # Run function
    output <- apptime(otree2,
                      "start")

    # Test
    test2 <- setequal(names(output), "messages")

    test3 <- expect_true(grepl(
      pattern = paste0("Durations not calculated. ",
      "If the first app only has one page, the indices"),
      x = output$message))

    # Run
    testthat::expect_true(all(c(test2, test3)))

  })

  testthat::test_that("App time - part code did not make it, othertime", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2 <- pagesec(otree2)
    otree2$Time$epoch_time_completed <- NULL
    person <- otree2$all_apps_wide$participant.code[
      otree2$all_apps_wide$participant._current_app_name != "survey"][1L]

    # Run function
    output <- apptime(otree2,
                      combine = FALSE,
                      pcode = person,
                      apps = "chatapp")

    testthat::expect_true(is.na(output))
    # TODO decide if message should be shown in the future
    # and test here (TODO #1).

  })

  testthat::test_that("App time - all apps, old oTree seconds on page2", {
    # Prepare data
    otree2 <- otree_2_2_4
    otree2 <- make_ids(otree2)
    otree2 <- pagesec(otree2)

    otree2$Time$time_stamp <- NULL

    # Run function
    output <- apptime(otree2,
                      sinfo = "session_id")

    # Test
    testthat::expect_output(str(output$start), "List of 4")
    testthat::expect_output(str(output), "List of 4")

    # Dictator
    test3 <- !is.null(output$dictator$mean_duration) &
      !is.na(output$dictator$mean_duration)
    test4 <- !is.null(output$dictator$min_duration) &
      !is.na(output$dictator$min_duration)
    test5 <- !is.null(output$dictator$max_duration) &
      !is.na(output$dictator$max_duration)
    # Such tests do not work in the old oTree,
    # because not all persons are also in the time file.
    # test4 <- (nrow(output$dictator$single_durations) +
    # length(output$dictator$warnings)) == nrow(otree2$dictator) / 3
    # Test if the values and the single_durations align

    test6 <- round(output$dictator$min_duration, 2L) ==
      round(min(output$dictator$single_durations$duration), 2L)
    test7 <- round(output$dictator$max_duration, 2L) ==
      round(max(output$dictator$single_durations$duration), 2L)
    test8 <- round(output$dictator$mean_duration, 2L) ==
      round(mean(output$dictator$single_durations$duration), 2L)

    testthat::expect_true(all(c(test3, test4,
                                test5, test6, test7, test8)))

    # Test  warnings
    testthat::expect_true(
      grepl(pattern =
              "or some participants, no duration could be calculated",
            x = output$chatapp$message))

    testthat::expect_true(exists("warnings", output$chatapp))

    test1 <- length(output$start$single_durations$participant) ==
      nrow(otree2$all_apps_wide) - 2L # Two people never left start page

    # No person in the Warnings list should be in the durations list!
    test2 <- !any(output$chatapp$warnings %in%
                    output$chatapp$single_durations$participant)
    test3 <- !any(output$dictator$warnings %in%
                    output$dictator$single_durations$participant)
    test4 <- !any(output$survey$warnings %in%
                    output$survey$single_durations$participant)

    # No duplicates in durations
    test5 <- !anyDuplicated(output$start$single_durations$participant)
    test6 <- !anyDuplicated(output$chatapp$single_durations$participant)
    test7 <- !anyDuplicated(output$dictator$single_durations$participant)
    test8 <- !anyDuplicated(output$survey$single_durations$participant)

    # No duplicates in warning
    test9 <- !anyDuplicated(output$chatapp$warnings)
    test10 <- !anyDuplicated(output$dictator$warnings)
    test11 <- !anyDuplicated(output$survey$warnings)

    testthat::expect_true(all(c(test1, test2, test3, test4, test5, test6,
                                test7, test8, test9, test10, test11)))

  })

  testthat::test_that("App time - all apps, old oTree seconds on page", {

    # Prepare data
    otree2 <- otree_2_2_4
    otree2 <- make_ids(otree2)

    otree2$Time$time_stamp <- NULL

    # Run function
    output <- apptime(otree2,
                      sinfo = "session_id")

    # Test
    testthat::expect_output(str(output$start), "List of 4")
    testthat::expect_output(str(output), "List of 4")

    # Dictator
    test3 <- !is.null(output$dictator$mean_duration) &
      !is.na(output$dictator$mean_duration)
    test4 <- !is.null(output$dictator$min_duration) &
      !is.na(output$dictator$min_duration)
    test5 <- !is.null(output$dictator$max_duration) &
      !is.na(output$dictator$max_duration)
    # Such tests do not work in the old oTree,
    # because not all persons are also in the time file.
    # test4 <- (nrow(output$dictator$single_durations) +
    # length(output$dictator$warnings)) == nrow(otree2$dictator) / 3
    # Test if the values and the single_durations align

    test6 <- round(output$dictator$min_duration, 2L) ==
      round(min(output$dictator$single_durations$duration), 2L)
    test7 <- round(output$dictator$max_duration, 2L) ==
      round(max(output$dictator$single_durations$duration), 2L)
    test8 <- round(output$dictator$mean_duration, 2L) ==
      round(mean(output$dictator$single_durations$duration), 2L)

    testthat::expect_true(all(c(test3, test4,
                                test5, test6, test7, test8)))

  })

  testthat::test_that("App time - Time df empty", {
    # Prepare data
    otree2 <- otree_2_2_4
    otree2$Time <- otree2$Time[NULL, ]

    # Run function and test
    testthat::expect_error(apptime(otree2,
                                   sinfo = NULL),
                           "data frame is empty")
  })

  testthat::test_that("App time - epoch time ", {
    # Prepare data
    otree2 <- otree_old_one

    # Run function
    output <- apptime(otree2)

    # Test
    testthat::expect_output(str(output), "List of 4")

    test1 <- "chatapp" %in% names(output)
    test2 <- "survey" %in% names(output)
    test3 <- "dictator" %in% names(output)
    test4 <- "survey" %in% names(output)
    testthat::expect_true(all(c(test1, test2, test3, test4)))

    # Test if the values and the single_durations align
    test5 <- round(output$dictator$mean_duration, 2L) ==
      round(min(output$dictator$single_durations$duration), 2L)
    test6 <- round(output$dictator$max_duration, 2L) ==
      round(max(output$dictator$single_durations$duration), 2L)
    test7 <- round(output$dictator$mean_duration, 2L) ==
      round(mean(output$dictator$single_durations$duration), 2L)
    testthat::expect_true(all(c(test1, test2, test3,
                                test5, test6, test7)))
  })

  testthat::test_that("App time - all apps old oTree group", {
    # Prepare data
    otree2 <- otree_2_2_4
    otree2 <- make_ids(otree2,
                       gmake = TRUE,
                       from_var = "dictator.1.group.id_in_subsession")

    # Run function
    output <- apptime(otree2,
                      group_id = 3L,
                      sinfo = "session_id")

    # Test
    test <- setequal(names(output),
                     c("chatapp", "dictator", "start", "survey"))
    testthat::expect_true(test)

    # Test for start
    test1 <- setequal(names(output$start),
                      "messages")
    testthat::expect_true(test1)

    # Test for chatapp
    test1 <- is.numeric(output$chatapp$mean_duration)
    test2 <- is.numeric(output$chatapp$max_duration)
    test3 <- is.numeric(output$chatapp$min_duration)
    test4 <- !is.null(output$chatapp$single_durations)
    testthat::expect_true(all(c(test1, test2, test3, test4)))

    # Test for dictator
    test1 <- is.numeric(output$dictator$mean_duration)
    test2 <- is.numeric(output$dictator$max_duration)
    test3 <- is.numeric(output$dictator$min_duration)
    test4 <- !is.null(output$dictator$single_durations)
    testthat::expect_true(all(c(test1, test2, test3, test4)))

    # Test for survey
    test1 <- is.numeric(output$survey$mean_duration)
    test2 <- is.numeric(output$survey$max_duration)
    test3 <- is.numeric(output$survey$min_duration)
    test4 <- !is.null(output$survey$single_durations)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("App time - all apps old oTree session code", {
    # Prepare data
    otree2 <- otree_2_2_4
    otree2 <- make_ids(otree2)

    # Run function and test
    testthat::expect_error(apptime(otree2, sinfo = "session_code"),
                           "There is no session_code or session__code")
  })

  testthat::test_that("App time - all apps no session info ", {
    # Prepare data
    otree2 <- otree_2_2_4
    otree2 <- make_ids(otree2)

    # Run function
    output <- apptime(otree2, sinfo = NULL)

    # Test
    testthat::expect_output(str(output), "List of 4")
    test1 <- setequal(names(output),
                      c("chatapp", "dictator", "start", "survey"))
    testthat::expect_true(test1)

    # Test for survey
    test1 <- is.numeric(output$survey$mean_duration)
    test2 <- is.numeric(output$survey$max_duration)
    test3 <- is.numeric(output$survey$min_duration)
    test4 <- is.null(output$survey$single_durations$session)
    testthat::expect_true(all(c(test1, test2, test3, test4)))

    # Test for dictator
    test1 <- is.numeric(output$dictator$mean_duration)
    test2 <- is.numeric(output$dictator$max_duration)
    test3 <- is.numeric(output$dictator$min_duration)
    test4 <- is.null(output$dictator$single_durations$session)
    testthat::expect_true(all(c(test1, test2, test3, test4)))

    # Test for start (only old otree not startreal)
    test1 <- setequal(names(output$start),
                      "messages")
    testthat::expect_true(test1)
  })

  testthat::test_that("App time - two apps: single durations didn't make it", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2 <- make_ids(otree2)
    person <- otree2$all_apps_wide$participant.code[
      otree2$all_apps_wide$participant._current_app_name == "dictator"][1L]

    # Run function
    output <- apptime(otree2,
                      pcode = "2scvem7a",
                      apps = c("survey", "chatapp"))

    # Test
    test1 <- setequal(names(output), c("survey", "chatapp"))
    test2 <- is.na(output$chatapp)
    test3 <- is.na(output$survey)
    testthat::expect_true(all(c(test1, test2, test3)))

  })

  testthat::test_that("App time - all apps: single durations didn't make it", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2 <- make_ids(otree2)
    person <- otree2$all_apps_wide$participant.code[
      otree2$all_apps_wide$participant._current_app_name == "dictator"][1L]

    # Run function
    testthat::expect_warning(
      output <- apptime(otree2,
                        pcode = person),
      "Duration could not be calculated for the person"
    )

    # Test
    test1 <- is.numeric(output$start)
    test2 <- is.numeric(output$dictator)
    test3 <- is.na(output$chatapp)
    test4 <- is.na(output$survey)

    testthat::expect_true(all(test1, test2, test3, test4))
  })

  testthat::test_that("App time - several apps: several didn't make it", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2 <- make_ids(otree2)

    # Run function
    output <- apptime(otree2)

    # Test
    warningmessage <- grepl("For some participants, no duration could",
                            output$survey$messages)

    testthat::expect_true(warningmessage)

    sum1 <- nrow(output$survey$single_durations) +
      length(output$survey$warnings)
    sum2 <- nrow(output$dictator$single_durations) +
      length(output$dictator$warnings)
    sum3 <- nrow(output$chatapp$single_durations) +
      length(output$chatapp$warnings)

    testthat::expect_identical(sum1, sum2)
    testthat::expect_identical(sum1, sum3)
    # Dictator should have more cases than survey
    testthat::expect_gte(nrow(output$dictator$single_durations),
                         nrow(output$survey$single_durations))
  })

  testthat::test_that("App time - all duplicate participants", {
    # Prepare data (make duplicate data)
    otree2 <- otree_5_4_0
    otree2$Time <- rbind(otree2$Time, otree2$Time)

    # Run function
    output <- apptime(otree2,
                      apps = "survey")

    # Test
    test <- grepl("Durations not calculated", output)
    testthat::expect_true(test)
  })

  testthat::test_that("App time - some duplicate participants", {
    # Prepare data (make duplicate data)
    otree2 <- otree_5_4_0
    person1 <- unique(otree2$Time$participant_code)[1L]
    person2 <- unique(otree2$Time$participant_code)[2L]

    otree2$Time <-
      rbind(otree2$Time,
            otree2$Time[otree2$Time$participant_code == person1, ],
            otree2$Time[otree2$Time$participant_code == person2, ])

    # Run function
    output <- apptime(otree2,
                      apps = "dictator")

    # Test
    test1 <- is.numeric(output$mean_duration)
    test2 <- is.numeric(output$max_duration)
    test3 <- is.numeric(output$min_duration)
    test4 <- all(output$duplicate_participants %in% (c(person1, person2)))
    test5 <- any(grepl("have duplicate data", output$messages))
    test6 <- any(grepl("no duration could be calculated", output$messages))

    test7 <- !(output$single_durations$participant %in%
                 output$duplicate_participants)
    test8 <- !(output$single_durations$participant %in%
                 output$warnings)
    test9 <- !(output$duplicate_participants %in%
                 output$warnings)
    test10 <- !(output$warnings %in%
                  output$duplicate_participants)

    testthat::expect_true(all(c(test1, test2, test3,
                                test4, test5, test6,
                                test7, test8, test9,
                                test10)))
  })

  testthat::test_that("App time - a whole session not there", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$Time$app_name[otree2$Time$app_name == "survey"] <- NA

    # Run function
    output <- apptime(otree2)

    # Test
    test <- grepl("Durations not calculated", output$survey)
    testthat::expect_true(test)
  })

  testthat::test_that("App time - participant is there more often ", {
    # Prepare data
    otree2 <- otree_5_4_0
    persons <- unique(otree2$Time$participant_code)[c(1L, 2L, 3L, 4L)]

    otree2$Time <- rbind(otree2$Time,
                         otree2$Time[
                           otree2$Time$participant_code %in% persons, ])

    # Run and test dictator
    output <- apptime(otree2,
                      apps = "dictator")
    test1 <- all(output$duplicate_participants == persons)
    testthat::expect_true(test1)
    test2 <- any(grepl("have duplicate data", output$messages))
    testthat::expect_true(test2)
    test3 <- any(grepl("no duration could be calculated", output$messages))
    testthat::expect_true(test3)

    # Run and test start
    output <- apptime(otree2,
                      apps = "start")
    test1 <- all(output$duplicate_participants == persons)
    testthat::expect_true(test1)
    test2 <- any(grepl("have duplicate data", output$messages))
    testthat::expect_true(test2)
  })

  testthat::test_that("App time - participant code", {
    # Prepare data
    otree2 <- otree_5_4_0

    person1 <- unique(otree2$Time$participant_code[
      otree2$Time$page_index > 10L])[1L]

    # Expect
    x <- otree2$Time[otree2$Time$participant_code == person1  &
                       otree2$Time$app_name == "dictator", ]
    max <- max(x$epoch_time_completed)

    min <- min(x$epoch_time_completed)
    min <- max(otree2$Time$epoch_time_completed[
      otree2$Time$participant_code == person1 &
        otree2$Time$epoch_time_completed < min])

    diff <- max - min
    diff <- diff / 60L

    # Run function
    output <- apptime(otree2, pcode = c(person1))

    # Test
    testthat::expect_identical(
      output$dictator,
      round(diff, digits = 2L))

    testthat::expect_true(
      all(
        names(output) ==  c("chatapp", "dictator", "start", "survey")))
  })

  testthat::test_that("App time - participant code did not make it", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Person with only certain entries
    person1 <- unique(otree2$Time$participant_code[
      otree2$Time$page_index > 3L &
        otree2$Time$page_index < 7L])[1L]

    # Delete the last pages
    otree2$Time <- otree2$Time[!(otree2$Time$participant_code == person1 &
                                   otree2$Time$page_index >= 7L), ]

    # Expect for dictator app
    x <- otree2$Time[otree2$Time$participant_code == person1  &
                       otree2$Time$app_name == "dictator", ]
    max <- max(x$epoch_time_completed)

    min <- min(x$epoch_time_completed)
    min <- max(otree2$Time$epoch_time_completed[
      otree2$Time$participant_code == person1 &
        otree2$Time$epoch_time_completed < min])

    diff <- max - min
    diff <- diff / 60L

    # Run function
    testthat::expect_warning(
      output <- apptime(otree2,
                        pcode = c(person1)),
      "Duration could not be calculated for the person in app")

    # Test

    testthat::expect_true(
      all(
        names(output) ==  c("chatapp", "dictator", "start", "survey")))

    testthat::expect_true(is.na(output$survey))
    testthat::expect_true(is.na(output$chatapp))

    testthat::expect_identical(
      output$dictator,
      round(diff, digits = 2L))
  })

  testthat::test_that("App time - participant code not in any + combine yes", {
    # Prepare data
    otree2 <- otree_all

    # Run function
    output <- apptime(otree2,
                      combine = TRUE,
                      pcode = "something")

    # Test
    testthat::expect_true(all(
      c("chatapp", "dictator", "survey", "start",
        "2chatapp", "dictator2") %in% names(output)))

    testthat::expect_true(is.na(output$survey))
  })

  testthat::test_that("App time - participant code did not make it", {
    # Prepare data
    otree2 <- otree_all

    # Run function
    output <- apptime(otree2,
                      combine = TRUE,
                      pcode = "something")

    # Test
    test <- is.na(output$survey)
    testthat::expect_true(test)
  })

  testthat::test_that("App time - two apps oTree old", {
    # Prepare data
    otree2 <- otree_2_2_4
    otree2 <- make_ids(otree2)

    # Run function
    output <- apptime(otree2,
                      apps = c("survey", "dictator"),
                      sinfo = "session_id")

    # Test
    testthat::expect_output(str(output), "List of 2")
  })

  testthat::test_that("App time - group", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2 <- make_ids(otree2, gmake = TRUE, from_app = "dictator")

    # Run function
    output <- apptime(otree2, group_id = 2L, apps = "dictator")

    # Test
    test1 <- !is.null(output$mean_duration) &
      !is.na(output$mean_duration)
    test2 <- !is.null(output$min_duration) &
      !is.na(output$min_duration)
    test3 <- !is.null(output$max_duration) &
      !is.na(output$max_duration)
    test4 <- exists("single_durations", output)
    test5 <- round(mean(output$single_durations$duration),
                   digits = 2L) == output$mean_duration

    # Test for exact values
    testthat::expect_true(output$min_duration == 0.67)
    testthat::expect_true(output$max_duration == 0.77)
    testthat::expect_true(output$mean_duration == 0.72)

    testthat::expect_true(all(c(test1, test2,
                                test3, test4,
                                test5)))
  })

  testthat::test_that("App time (e) - participant code not in any", {
    # Prepare data
    otree2 <- otree_all

    # Run function
    testthat::expect_error(
      output <- apptime(otree2,
                        combine = FALSE,
                        pcode = "something"),
      "referred to the time stamp.*referred to the participant code")
  })

  testthat::test_that("App time - participant label", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2 <- make_ids(otree2, pmake = TRUE)

    # Make new participant labels
    otree2$all_apps_wide$participant.label <-
      paste("Person",
            data.table::rleidv(otree2$all_apps_wide$participant.code))

    # Expect
    person_code <- otree2$all_apps_wide$participant.code[
      otree2$all_apps_wide$participant._current_app_name == "survey" &
        otree2$all_apps_wide$participant.label != ""][1L]

    person_label <- otree2$all_apps_wide$participant.label[
      otree2$all_apps_wide$participant._current_app_name == "survey" &
        otree2$all_apps_wide$participant.label != ""][1L]

    # Comparison data frame
    xminus1 <- max(otree2$Time[
      otree2$Time$participant_code == person_code &
        otree2$Time$app_name == "chatapp", ]$epoch_time_completed)

    x <- otree2$Time[
      otree2$Time$participant_code == person_code &
        otree2$Time$app_name == "survey", ]

    max <- max(x$epoch_time_completed)

    diff <- max - xminus1
    diff <- diff / 60L

    # Run function
    output <- apptime(otree2,
                      plabel = person_label,
                      digits = 2L)

    # Test
    testthat::expect_identical(
      output$survey,
      round(diff, digits = 2L))
  })

  testthat::test_that("App time - two apps", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function
    output <- apptime(otree2,
                      apps = c("survey", "dictator"))

    # Test
    testthat::expect_output(str(output), "List of 2")
    test1 <- !is.null(output$dictator$mean_duration) &
      !is.na(output$dictator$mean_duration)
    test2 <- !is.null(output$dictator$min_duration) &
      !is.na(output$dictator$min_duration)
    test3 <- !is.null(output$dictator$max_duration) &
      !is.na(output$dictator$max_duration)

    test4 <- !is.null(output$survey$mean_duration) &
      !is.na(output$survey$mean_duration)
    test5 <- !is.null(output$survey$min_duration) &
      !is.na(output$survey$min_duration)
    test6 <- !is.null(output$survey$max_duration) &
      !is.na(output$survey$max_duration)

    test7 <- exists("single_durations", output$dictator)
    test8 <- exists("single_durations", output$survey)

    testthat::expect_true(test1)
    testthat::expect_true(test2)
    testthat::expect_true(test3)
    testthat::expect_true(test4)
    testthat::expect_true(test5)
    testthat::expect_true(test6)
    testthat::expect_true(test7)
    testthat::expect_true(test8)
  })

  testthat::test_that("App time - three apps old", {
    # Prepare data
    otree2 <- otree_2_2_4

    # Run function
    output <- apptime(otree2,
                      sinfo = NULL,
                      apps = c("start", "survey", "dictator"))

    # Start problem only relevant in old otree
    testthat::expect_true(setequal(
      names(output$start), "messages"))

    testthat::expect_true(grepl(
      x = output$start$message,
      pattern =  ".*If the first app only has one page, the indices.*"
    ))

    # Test
    testthat::expect_output(str(output), "List of 3")
    testthat::expect_true(setequal(names(output),
                                   c("start", "survey", "dictator")))

    test1 <- !is.null(output$dictator$mean_duration) &
      !is.na(output$dictator$mean_duration)
    test2 <- !is.null(output$dictator$min_duration) &
      !is.na(output$dictator$min_duration)
    test3 <- !is.null(output$dictator$max_duration) &
      !is.na(output$dictator$max_duration)

    test4 <- !is.null(output$survey$mean_duration) &
      !is.na(output$survey$mean_duration)
    test5 <- !is.null(output$survey$min_duration) &
      !is.na(output$survey$min_duration)
    test6 <- !is.null(output$survey$max_duration) &
      !is.na(output$survey$max_duration)

    test7 <- exists("single_durations", output$dictator)
    test8 <- exists("single_durations", output$survey)

    testthat::expect_true(test1)
    testthat::expect_true(test2)
    testthat::expect_true(test3)
    testthat::expect_true(test4)
    testthat::expect_true(test5)
    testthat::expect_true(test6)
    testthat::expect_true(test7)
    testthat::expect_true(test8)
  })

  testthat::test_that("App time (e) - two apps no session_code - old", {
    # Prepare data
    otree2 <- otree_2_2_4

    # Run function and test
    testthat::expect_error(
      apptime(otree2,
              apps = c("survey", "dictator")),
      "no session_code or session__code")
  })

  testthat::test_that("App time (e) - no group_id", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(
      apptime(otree2, group_id = 6L, apps = "dictator"),
      "Variable group_id is not in \"Time\" data frame")
  })

  testthat::test_that("App time (e) - non-unique participant label", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function
    testthat::expect_error(
      apptime(otree2,
              plabel = "Person2"),
      "You do not have unique participant labels in your")
  })

  testthat::test_that("App time (e) - app", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function
    testthat::expect_error(apptime(otree2, apps = "Hinz"))
  })

  testthat::test_that("App time (e) - no epoch time old", {
    # Prepare data
    otree2 <- otree_old_one
    otree2$Time$epoch_time <- NULL

    # Run function and test
    testthat::expect_error(apptime(otree2),
                           "There is no variable referring to")
  })

  testthat::test_that("App time (e) - no participant code old", {
    # Prepare data
    otree2 <- otree_old_one
    otree2$Time$participant_code <- NULL

    # Run function and test
    testthat::expect_error(apptime(otree2),
                           "No variable referring to")
  })

  testthat::test_that("App time (e) - no Time data frame", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$Time <- NULL

    # Run function and test
    testthat::expect_error(apptime(otree2,
                                   apps = "survey"),
                           "There is no")
  })

  testthat::test_that("App time (e) - wrong group_id", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2 <- make_ids(otree2, gmake = TRUE,
                       from_var = "dictator.1.group.id_in_subsession")

    # Run function and test
    testthat::expect_error(apptime(otree2,
                                   group_id = 400L,
                                   apps = "survey"),
                           "group_id is not in \"Time\" data frame")
  })

  testthat::test_that("App time (e) -  p.label and no all_apps_wide", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$all_apps_wide <- NULL

    # Run function and test
    testthat::expect_error(apptime(otree2,
                                   plabel = "Person1",
                                   apps = "survey"),
                           "You can only use")
  })

  testthat::test_that("App time (e) - no session_id in the Time data frame", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(apptime(otree2,
                                   sinfo = "session_id",
                                   apps = "survey"),
                           "There is no session_id in the Time data frame")
  })

  testthat::test_that("App time (e) - no session_id in the Time data frame", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(apptime(otree2,
                                   sinfo = "session.id",
                                   apps = "survey"),
                           "Please specify a valid sinfo")
  })

  testthat::test_that("App time (e) - only group or participant", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(apptime(otree2,
                                   plabel = "Person1",
                                   group_id = 1L,
                                   apps = "survey"),
                           "Please enter only")
  })

  testthat::test_that("App time (e) - specified duplicate participant", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Make duplicate data
    person1 <- unique(otree2$Time$participant_code)[1L]
    otree2$Time <-
      rbind(otree2$Time,
            otree2$Time[otree2$Time$participant_code == person1, ])

    # Run function
    testthat::expect_error(
      apptime(otree2,
              pcode = person1,
              apps = "dictator"),
      "This person has duplicate data in their Time data")
  })

  testthat::test_that("App time (e) - only participant.code or group_id", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(apptime(otree2,
                                   pcode = "46kxib6w",
                                   group_id = 1L,
                                   apps = "survey"),
                           "Please enter only pcode or group_id")
  })

  testthat::test_that("App time (e) - only p.label or p.code", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(apptime(otree2,
                                   plabel = "Person1",
                                   pcode = "46kxib6w",
                                   apps = "survey"),
                           "Please enter only")
  })

  testthat::test_that("App time (e) - two participants (label)", {
    # Prepare data
    otree2 <- otree_5_4_0
    part <- c("xx78b3x0", "46kxib6w")

    # Run function and test
    part <- c("Person1", "Person2")
    testthat::expect_error(
      apptime(otree2,
              plabel = part),
      "Please enter only one participant")
  })

  testthat::test_that("App time (e) - two participants (code)", {
    # Prepare data
    otree2 <- otree_5_4_0
    part <- c("xx78b3x0", "46kxib6w")

    # Run function and test
    testthat::expect_error(
      apptime(otree2,
              pcode = part),
      "Please enter only one participant")
  })

  print("---- extime -----")

  # App time - one app  ####
  testthat::test_that("App time - one app", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function
    output <- apptime(otree2,
                      apps = "dictator")

    # Test
    testthat::expect_output(str(output), "List of 6")

    test1 <- !is.null(output$mean_duration) &
      !is.na(output$mean_duration)
    test2 <- !is.null(output$min_duration) &
      !is.na(output$min_duration)
    test3 <- !is.null(output$max_duration) &
      !is.na(output$max_duration)
    # Test if the values and the single_durations align

    test5 <- round(output$min_duration, 2L) ==
      round(min(output$single_durations$duration), 2L)
    test6 <- round(output$max_duration, 2L) ==
      round(max(output$single_durations$duration), 2L)
    test7 <- round(output$mean_duration, 2L) ==
      round(mean(output$single_durations$duration), 2L)

    # Run
    testthat::expect_true(all(c(test1, test2, test3,
                                test5, test6, test7)))
    # Test warnings
    testthat::expect_true(
      grepl("or some participants, no duration could be calculated",
            output$messages))

    testthat::expect_true(exists("warnings", output))

    # Warnings not in duration
    testthat::expect_false(any(output$warnings %in%
                                 output$single_durations$participant))

    # No duplicates in durations
    testthat::expect_true(!anyDuplicated(output$single_durations$participant))

    # No duplicates in warning
    testthat::expect_true(!anyDuplicated(output$warnings))
  })

  testthat::test_that("App time - one app", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function
    output <- apptime(otree2,
                      "dictator")

    # Test
    testthat::expect_output(str(output), "List of 6")
    test1 <- !is.null(output$mean_duration) &
      !is.na(output$mean_duration)
    test2 <- !is.null(output$min_duration) &
      !is.na(output$min_duration)
    test3 <- !is.null(output$max_duration) &
      !is.na(output$max_duration)
    testthat::expect_true(all(c(test1, test2, test3)))
    # Test if the values and the single_durations align
    test5 <- round(output$min_duration, 2L) ==
      round(min(output$single_durations$duration), 2L)
    test6 <- round(output$max_duration, 2L) ==
      round(max(output$single_durations$duration), 2L)
    test7 <- round(output$mean_duration, 2L) ==
      round(mean(output$single_durations$duration), 2L)
    testthat::expect_true(all(c(test1, test2, test3,
                                test5, test6, test7)))
  })

  testthat::test_that("App time - one app: seconds on page 2", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2 <- pagesec(otree2)
    otree2$Time$epoch_time_completed <- NULL

    # Run function
    output <- apptime(otree2,
                      "dictator")

    # Test
    testthat::expect_output(str(output), "List of 6")
    test1 <- !is.null(output$mean_duration) &
      !is.na(output$mean_duration)
    test2 <- !is.null(output$min_duration) &
      !is.na(output$min_duration)
    test3 <- !is.null(output$max_duration) &
      !is.na(output$max_duration)
    # Test if the values and the single_durations align

    test5 <- round(output$min_duration, 2L) ==
      round(min(output$single_durations$duration), 2L)
    test6 <- round(output$max_duration, 2L) ==
      round(max(output$single_durations$duration), 2L)
    test7 <- round(output$mean_duration, 2L) ==
      round(mean(output$single_durations$duration), 2L)

    testthat::expect_true(all(c(test1, test2, test3,
                                test5, test6, test7)))

    tested_message <- paste0(
      "For some participants, no duration could be ",
      "calculated. See list in \\$warnings. Did they ",
      "make it to the app\\(s\\)\\?"
    )

    warningmessage <- grepl(tested_message,
                            output$messages)
    testthat::expect_true(warningmessage)

  })

  testthat::test_that("App time (e) - one app: one wrong app", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2 <- make_ids(otree2)

    # Run function and test
    testthat::expect_error(
      apptime(otree2,
              apps = "wrongapp"),
      "The apps specified in the argument apps are not in the")
  })

  testthat::test_that("App time - one app: no error one app okay", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2 <- make_ids(otree2)
    num_participants <- nrow(otree2$all_apps_wide)

    # Run function
    testthat::expect_warning(
      output <- apptime(otree2,
                        apps = c("wrongapp", "dictator")),
      "not in the list of oTree data frame")

    # Test
    testthat::expect_output(str(output), "List of 6")

    test1 <- !is.null(output$mean_duration) & !is.na(output$mean_duration)
    test2 <- !is.null(output$min_duration) & !is.na(output$min_duration)
    test3 <- !is.null(output$max_duration) & !is.na(output$max_duration)
    test4 <- exists("single_durations", output)

    # Warnings not in durations!
    test5 <- !any(output$warnings %in%
                    output$single_durations$participant)

    # No duplicates in durations
    test6 <- !anyDuplicated(output$single_durations$participant)

    # No duplicates in warning
    test7 <- !anyDuplicated(output$warnings)

    test8 <- length(output$single_durations$participant) +
      length(output$warnings) == num_participants

    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6, test7,
                                test8)))
  })

  testthat::test_that("App time - one app: single durations didn't make it", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2 <- make_ids(otree2)

    # Run function
    output <- apptime(otree2,
                      pcode = "2scvem7a",
                      apps = "survey")

    # Test
    test <- is.na(output)
    testthat::expect_true(test)

  })

  testthat::test_that("App time - one app: several durations didn't make it", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2 <- make_ids(otree2)

    # Run function
    output <- apptime(otree2,
                      apps = "survey")

    # Test
    test1 <- is.numeric(output$mean_duration)
    test2 <- is.numeric(output$max_duration)
    test3 <- is.numeric(output$min_duration)
    test4 <- !is.null(output$single_durations)
    test5 <- grepl("For some participants, no duration could",
                   output$messages)
    test6 <- is.vector(output$warnings)
    test7 <- !(output$warnings %in% output$single_durations)
    testthat::expect_true(all(c(test1, test2, test3,
                                test4, test5, test6,
                                test7)))
  })

  testthat::test_that("App time - one app oTree old", {
    # Prepare data
    otree2 <- otree_2_2_4
    otree2 <- make_ids(otree2)

    # Run function
    output <- apptime(otree2, "dictator", sinfo = "session_id")

    # Test
    testthat::expect_output(str(output), "List of 6")
    test1 <- !is.null(output$mean_duration) & !is.na(output$mean_duration)
    test2 <- !is.null(output$min_duration) & !is.na(output$min_duration)
    test3 <- !is.null(output$max_duration) & !is.na(output$max_duration)
    test4 <- exists("single_durations", output)
    test5 <- exists("warnings", output)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5)))
  })

  testthat::test_that("App time - one dup part - all data one app", {
    # Prepare data
    otree2 <- otree_5_4_0
    person1 <- unique(otree2$Time$participant_code)[1L]

    # Make duplicate data
    otree2$Time <-
      rbind(otree2$Time,
            otree2$Time[otree2$Time$participant_code == person1, ])

    # Run function and test dictator
    output <- apptime(otree2,
                      apps = "dictator")

    test0 <- all(output$duplicate_participants == person1)
    test1 <- is.numeric(output$mean_duration)
    test2 <- is.numeric(output$max_duration)
    test3 <- is.numeric(output$min_duration)

    test4 <- all(output$duplicate_participants %in% (c(person1)))
    test5 <- any(grepl("have duplicate data", output$messages))
    test6 <- any(grepl("no duration could be calculated", output$messages))

    test7 <- !(output$single_durations$participant %in%
                 output$duplicate_participants)
    test8 <- !(output$single_durations$participant %in%
                 output$warnings)
    test9 <- !(output$duplicate_participants %in%
                 output$warnings)
    test10 <- !(output$warnings %in%
                  output$duplicate_participants)

    testthat::expect_true(all(c(test0, test1, test2, test3,
                                test4, test5, test6,
                                test7, test8, test9,
                                test10)))

    # Run function and test start
    output <- apptime(otree2,
                      apps = "start")
    test0 <- all(output$duplicate_participants == person1)
    test1 <- is.numeric(output$mean_duration)
    test2 <- is.numeric(output$max_duration)
    test3 <- is.numeric(output$min_duration)
    test4 <- all(output$duplicate_participants %in% (c(person1)))
    test5 <- any(grepl("have duplicate data", output$messages))

    test7 <- !(output$single_durations$participant %in%
                 output$duplicate_participants)
    test8 <- !("warnings" %in% names(output))

    testthat::expect_true(all(c(test0, test1, test2, test3,
                                test4, test5, test6,
                                test7, test8)))
  })

  # Import tests  ####
  testthat::test_that("Import - Excel", {

    file_names <- list.files(
      path = testthat::test_path("testdata", "exp_data_2.1.0"),
      pattern = "[0-9]{4}-[0-9]{2}-[0-9]{2}.xlsx")

    # Run function
    testthat::expect_message(
      otree2 <- import_otree(
        del_empty = TRUE,
        path = testthat::test_path("testdata", "exp_data_2.1.0"),
        onlybots = FALSE,
        csv = FALSE,
        info = TRUE), "Imported:.*Errors when importing these files")

    # Test
    testthat::expect_output(str(otree2), "List of 8")
    testthat::expect_vector(otree2$info$imported_files)
    # (Plus two because of Chats and Time!)
    test1 <- length(otree2$info$imported_files)  == 7L
    # Don't do that because there are also
    # faulty files: length(file_names) + 2
    testthat::expect_true(test1)
  })

  testthat::test_that("Import (w, e) -  warnings excel", {
    # Usually, warning messages are suppressed because the same files
    # also occur in the error messages!

    file_names <- list.files(
      path = testthat::test_path("testdata", "exp_data_2.1.0.w"),
      pattern = "[0-9]{4}-[0-9]{2}-[0-9]{2}.xlsx")

    # This file would throw a warning
    # chatapp_2023-05-16.xlsx"

    # Run function - Errors are only shown if info = TRUE but only as
    # message!
    testthat::expect_message(
      otree2 <- import_otree(
        del_empty = TRUE,
        path = testthat::test_path("testdata", "exp_data_2.1.0.w"),
        onlybots = FALSE,
        csv = FALSE,
        info = TRUE), "Errors when importing these files:.*"
    )

    # Run function - Errors are not shown if info = FALSE
    testthat::expect_error(
      otree2 <- import_otree(
        del_empty = TRUE,
        path = testthat::test_path("testdata", "exp_data_2.1.0.w"),
        onlybots = FALSE,
        csv = FALSE,
        info = FALSE), NA
    )
    testthat::expect_message(
      otree2 <- import_otree(
        del_empty = TRUE,
        path = testthat::test_path("testdata", "exp_data_2.1.0.w"),
        onlybots = FALSE,
        csv = FALSE,
        info = FALSE), NA
    )
  })

  testthat::test_that("Import - subapp name test1", {
    # Run function
    testthat::expect_warning(
      otree2 <- import_otree(
        del_empty = TRUE,
        path = testthat::test_path("testdata",
                                   "exp_data_5.4.0subapp"),
        onlybots = FALSE,
        csv = TRUE,
        info = FALSE),
      "globally but also room-specific")

    # Test
    test1 <- "2chatapp" %in% names(otree2)
    test2 <- "chatapp" %in% names(otree2)
    test3 <- "dictator" %in% names(otree2)
    test4 <- "dictator2" %in% names(otree2)

    # Test if nothing is deleted from custom export
    test5 <- "custexp_dictator" %in% names(otree2)
    test6 <- nrow(otree2$custexp_dictator) == 8L

    # Run tests
    testthat::expect_true(all(c(test1, test2, test3,
                                test4, test5, test6)))
  })

  testthat::test_that("Import - delete dropouts old", {
    # Run functions

    # Delete dropouts in two steps

    otree1 <- import_otree(
      del_empty = TRUE,
      path = testthat::test_path("testdata", "exp_data_2.2.4"),
      onlybots = FALSE,
      csv = TRUE,
      info = FALSE)

    testthat::expect_message(
      otree2 <- delete_dropouts(otree1,
                                final_apps = "survey",
                                info = TRUE),
      "Dropouts are deleted"
    )

    # Delete dropouts in one step
    suppressWarnings({
      testthat::expect_message(
        otree3 <- import_otree(
          del_empty = TRUE,
          path = testthat::test_path("testdata", "exp_data_2.2.4"),
          onlybots = FALSE,
          csv = TRUE,
          final_apps = "survey",
          info = TRUE),
        "Dropouts are deleted from all data frames.")
    })

    #  No message should be shown if info = FALSE
    suppressWarnings({
      testthat::expect_message(
        otree3 <- import_otree(
          del_empty = TRUE,
          path = testthat::test_path("testdata", "exp_data_2.2.4"),
          onlybots = FALSE,
          csv = TRUE,
          final_apps = "survey",
          info = FALSE), NA)
    })

    # Test if dropouts were deleted
    test1 <- nrow(otree1$all_apps_wide) > nrow(otree2$all_apps_wide)
    test2 <- nrow(otree1$dictator) > nrow(otree2$dictator)
    test3 <- nrow(otree1$survey) > nrow(otree2$survey)
    test4 <- nrow(otree1$Chats) == nrow(otree2$Chats) # Must be equal!
    test5 <- nrow(otree1$Time) > nrow(otree2$Time)

    # Run tests
    testthat::expect_true(all(c(test1, test2, test3,
                                test4, test5)))

    # Test if after-dropout numbers are the same
    test1 <- nrow(otree3$all_apps_wide) == nrow(otree2$all_apps_wide)
    test2 <- nrow(otree3$dictator) == nrow(otree2$dictator)
    test3 <- nrow(otree3$survey) == nrow(otree2$survey)
    test4 <- nrow(otree3$Chats) == nrow(otree2$Chats)
    test5 <- nrow(otree3$Time) == nrow(otree2$Time)

    # Run tests
    testthat::expect_true(all(c(test1, test2, test3,
                                test4, test5)))
  })

  testthat::test_that("Import - delete dropouts", {
    # Run functions

    # Delete dropouts in two steps
    testthat::expect_warning(
      otree1 <- import_otree(
        del_empty = TRUE,
        path = testthat::test_path("testdata", "exp_data_5.4.0"),
        onlybots = FALSE,
        csv = TRUE,
        info = FALSE), "globally")

    testthat::expect_message(
      otree2 <- delete_dropouts(otree1,
                                final_apps = "survey",
                                info = TRUE),
      "Dropouts are deleted"
    )

    # Delete dropouts in one step
    suppressWarnings({
      testthat::expect_message(
        otree3 <- import_otree(
          del_empty = TRUE,
          path = testthat::test_path("testdata", "exp_data_5.4.0"),
          onlybots = FALSE,
          csv = TRUE,
          final_apps = "survey",
          info = TRUE),
        "Dropouts are deleted from all data frames.")
    })

    #  No message should be shown if info = FALSE
    suppressWarnings({
      testthat::expect_message(
        otree3 <- import_otree(
          del_empty = TRUE,
          path = testthat::test_path("testdata", "exp_data_5.4.0"),
          onlybots = FALSE,
          csv = TRUE,
          final_apps = "survey",
          info = FALSE), NA)
    })

    # Test if dropouts were deleted
    test1 <- nrow(otree1$all_apps_wide) > nrow(otree2$all_apps_wide)
    test2 <- nrow(otree1$dictator) > nrow(otree2$dictator)
    test3 <- nrow(otree1$survey) > nrow(otree2$survey)
    test4 <- nrow(otree1$Chats) == nrow(otree2$Chats) # Must be equal!
    test5 <- nrow(otree1$Time) > nrow(otree2$Time)

    # Run tests
    testthat::expect_true(all(c(test1, test2, test3,
                                test4, test5)))

    # Test if after-dropout numbers are the same
    test1 <- nrow(otree3$all_apps_wide) == nrow(otree2$all_apps_wide)
    test2 <- nrow(otree3$dictator) == nrow(otree2$dictator)
    test3 <- nrow(otree3$survey) == nrow(otree2$survey)
    test4 <- nrow(otree3$Chats) == nrow(otree2$Chats)
    test5 <- nrow(otree3$Time) == nrow(otree2$Time)

    # Run tests
    testthat::expect_true(all(c(test1, test2, test3,
                                test4, test5)))

    # Test if nothing is deleted from custom export
    testthat::expect_true("custexp_dictator" %in% names(otree1))
    testthat::expect_true(nrow(otree1$custexp_dictator) == 8L)
    testthat::expect_true("custexp_dictator" %in% names(otree3))
    testthat::expect_true(nrow(otree3$custexp_dictator) == 8L)
  })

  testthat::test_that("Import - bot files", {
    # Run function
    otree_bot <- import_otree(
      del_empty = TRUE,
      path = file.path("testdata", "bot_data"),
      onlybots = TRUE,
      csv = TRUE,
      info = FALSE)

    # Test
    testthat::expect_identical(
      unique(otree_bot$all_apps_wide$participant._is_bot), 1L)
  })

  testthat::test_that("Import - all info FALSE", {
    # Run function
    testthat::expect_warning(
      otree2 <- import_otree(
        del_empty = TRUE,
        onlybots = FALSE,
        csv = TRUE,
        info = FALSE),
      "globally but also room-specific")

    # Test structure
    testthat::expect_output(str(otree2), "List of 11")

    testthat::expect_true(all(
      c("all_apps_wide", "info", "chatapp",  "dictator",
        "survey", "start", "custexp_dictator", "2chatapp",
        "dictator2", "Time", "Chats") %in% names(otree2)))

    testthat::expect_true(all(
      c("imported_files", "initial_n") %in% names(otree2$info)
    ))
  })

  testthat::test_that("Import - without empty OLD", {
    # Run function

    otree2 <- import_otree(
      path = testthat::test_path("testdata", "exp_data_2.2.4"),
      del_empty = TRUE,
      onlybots = FALSE,
      csv = TRUE,
      info = FALSE)

    # Test structure
    testthat::expect_true(all(
      c("all_apps_wide", "info", "chatapp",  "dictator",
        "survey", "start", "Time", "Chats") %in% names(otree2)))

    testthat::expect_true(all(
      c("imported_files", "initial_n") %in% names(otree2$info)
    ))

    # Test if there are no empty
    testthat::expect_false(
      "" %in% otree2$all_apps_wide$participant._current_app_name
    )

    testthat::expect_false(
      "" %in% otree2$all_apps_wide$participant._current_page_name
    )
  })

  testthat::test_that("Import - with empty OLD", {
    # Run function
    otree2 <- import_otree(
      path = testthat::test_path("testdata", "exp_data_2.2.4"),
      del_empty = FALSE,
      onlybots = FALSE,
      csv = TRUE,
      info = FALSE)

    # Test structure
    testthat::expect_true(all(
      c("all_apps_wide", "info", "chatapp",  "dictator",
        "survey", "start", "Time", "Chats") %in% names(otree2)))

    testthat::expect_true(all(
      c("imported_files", "initial_n") %in% names(otree2$info)
    ))

    # Test if there are empty
    testthat::expect_true(
      "" %in% otree2$all_apps_wide$participant._current_app_name
    )

    testthat::expect_true(
      "" %in% otree2$all_apps_wide$participant._current_page_name
    )
  })

  testthat::test_that("Import - without empty", {
    # Run function
    testthat::expect_message(
      testthat::expect_warning(
        otree2 <- import_otree(
          del_empty = TRUE,
          onlybots = FALSE,
          csv = TRUE,
          info = TRUE), "globally but also room-specific"),
      "Imported:.*Errors when importing these files")

    # Test structure
    testthat::expect_output(str(otree2), "List of 11")

    testthat::expect_true(all(
      c("all_apps_wide", "info", "chatapp",  "dictator",
        "survey", "start", "custexp_dictator", "2chatapp",
        "dictator2", "Time", "Chats") %in% names(otree2)))

    testthat::expect_true(all(
      c("imported_files", "initial_n") %in% names(otree2$info)
    ))

    # Test if there are no empty
    testthat::expect_false(
      "" %in% otree2$all_apps_wide$participant._current_app_name
    )

    testthat::expect_false(
      "" %in% otree2$all_apps_wide$participant._current_page_name
    )
  })

  testthat::test_that("Import - with empty", {
    # Run function
    testthat::expect_message(
      testthat::expect_warning(
        otree2 <- import_otree(
          del_empty = FALSE,
          onlybots = FALSE,
          csv = TRUE,
          info = TRUE), "globally but also room-specific"),
      "Imported:.*Errors when importing these files")

    # Test structure
    testthat::expect_output(str(otree2), "List of 11")

    testthat::expect_true(all(
      c("all_apps_wide", "info", "chatapp",  "dictator",
        "survey", "start", "custexp_dictator", "2chatapp",
        "dictator2", "Time", "Chats") %in% names(otree2)))

    testthat::expect_true(all(
      c("imported_files", "initial_n") %in% names(otree2$info)
    ))

    # Test if there are empty
    testthat::expect_true(
      "" %in% otree2$all_apps_wide$participant._current_app_name
    )

    testthat::expect_true(
      "" %in% otree2$all_apps_wide$participant._current_page_name
    )
  })

  testthat::test_that("Import - all", {

    # Del_empty is TRUE
    testthat::expect_message(
      testthat::expect_warning(
        otree1 <- import_otree(
          del_empty = TRUE,
          onlybots = FALSE,
          csv = TRUE,
          info = TRUE
        ), "globally but also room-specific"),
      "Imported:.*Errors when importing")

    # Del_empty is FALSE
    testthat::expect_message(
      testthat::expect_warning(
        otree2 <- import_otree(
          del_empty = FALSE,
          onlybots = FALSE,
          csv = TRUE,
          info = TRUE
        ), "globally but also room-specific"),
      "Imported:.*Errors when importing")

    # Test
    testthat::expect_output(str(otree2),
                            "List of 11")
    # "start", "dictator", "chatapp", "survey",
    # "all_apps_wide", "Time", "Chats" "custexp_dictator"

    diff <- nrow(otree2$all_apps_wide[
      otree2$all_apps_wide$participant._current_app_name == "", ])
    test1 <- (otree2$info$initial_n - otree1$info$initial_n) == diff

    testthat::expect_true(test1)
  })

  testthat::test_that("Import - subapp name test2 ", {
    # Run function
    otree2 <- import_otree(
      del_empty = TRUE,
      path = testthat::test_path("testdata", "exp_data_5.4.0subapp"),
      file_names = c("2chatapp_2023-05-16.csv",
                     "chatapp_2023-05-16.csv",
                     "dictator2_2023-05-16.csv",
                     "dictator_2023-05-16.csv"),
      onlybots = FALSE,
      csv = TRUE,
      info = FALSE)

    # Test
    test1 <- "2chatapp" %in% names(otree2)
    test2 <- "chatapp" %in% names(otree2)
    test3 <- "dictator" %in% names(otree2)
    test4 <- "dictator2" %in% names(otree2)

    testthat::expect_true(all(c(
      test1, test2, test3, test4)))
  })

  testthat::test_that("Import - empty rows check", {
    # Run function
    testthat::expect_warning(
      otree2 <- import_otree(
        del_empty = FALSE,
        onlybots = FALSE,
        csv = TRUE,
        info = FALSE), "globally but also room-specific")

    testthat::expect_warning(
      otree3 <- import_otree(
        del_empty = TRUE,
        onlybots = FALSE,
        csv = TRUE,
        info = FALSE), "globally but also room-specific")

    # Test
    testthat::expect_gt(nrow(otree2$all_apps_wide),
                        nrow(otree3$all_apps_wide))
    testthat::expect_gt(nrow(otree2$dictator),
                        nrow(otree3$dictator))
    testthat::expect_gt(nrow(otree2$survey),
                        nrow(otree3$survey))
    testthat::expect_identical(nrow(otree2$Time),
                               nrow(otree3$Time))
    testthat::expect_identical(nrow(otree2$Chats),
                               nrow(otree3$Chats))
  })

  testthat::test_that("Import - with 2 paths", {
    # Run function
    otree1 <- import_otree(
      del_empty = TRUE,
      path = c(testthat::test_path("testdata", "exp_data_2.2.4")),
      onlybots = FALSE,
      csv = TRUE,
      info = FALSE)  # No warning here

    testthat::expect_warning(
      otree2 <- import_otree(
        del_empty = TRUE,
        path = testthat::test_path("testdata", "exp_data_5.4.0"),
        onlybots = FALSE,
        csv = TRUE,
        info = FALSE),
      " stored all_apps_wide globally but also room-specific")

    testthat::expect_warning(
      otree3 <- import_otree(
        del_empty = TRUE,
        path = c(testthat::test_path("testdata", "exp_data_2.2.4"),
                 testthat::test_path("testdata", "exp_data_5.4.0")),
        onlybots = FALSE,
        csv = TRUE,
        info = FALSE
      ), " stored all_apps_wide globally but also room-specific")

    # Test
    test1 <- nrow(otree1$all_apps_wide) +
      nrow(otree2$all_apps_wide) ==
      nrow(otree3$all_apps_wide)
    testthat::expect_true(test1)
  })

  testthat::test_that("Import - with file_names(path included)", {
    # Run function
    otree2 <- import_otree(
      del_empty = TRUE,
      file_names = c("testdata\\exp_data_5.4.0\\all_apps_wide-2023-05-16.csv",
                     "testdata\\exp_data_5.4.0\\ChatMessages-2023-05-16.csv",
                     "testdata\\exp_data_5.4.0\\PageTimes-2023-05-16.csv"),
      onlybots = FALSE,
      csv = TRUE,
      info = FALSE)

    # Test
    testthat::expect_output(str(otree2), "List of 4")
    test1 <- ("initial_n" %in% names(otree2$info))
    testthat::expect_true(test1)
    test2 <- length(otree2$info$imported_files) == 3L
    testthat::expect_true(test2)
  })

  testthat::test_that("Import - with file_names- one warning", {
    # Test if there is no warning if "all apps wide" is saved with -
    # and not with _ before the date. (as it should be)

    # Run function
    expect_warning(
      otree2 <- import_otree(
        del_empty = TRUE,
        path = "testdata",
        file_names = c(
          file.path("exp_data", "all_apps_wide-2023-03-27.csv"),
          file.path("exp_data", "ChatMessages-2023-03-27.csv"),
          file.path("exp_data", "PageTimes-2023-03-27.csv")
        ),
        onlybots = FALSE,
        csv = TRUE,
        info = FALSE), NA)

    # Test
    testthat::expect_output(str(otree2), "List of 4")
    test1 <- ("initial_n" %in% names(otree2$info))
    testthat::expect_true(test1)
    test2 <- length(otree2$info$imported_files) == 3L
    testthat::expect_true(test2)
  })

  testthat::test_that("Import - only Chats", {
    # Run function
    otree2 <- import_otree(
      del_empty = TRUE,
      path = "testdata",
      file_names = file.path("exp_data_5.4.0", "ChatMessages-2023-05-16.csv"),
      onlybots = FALSE,
      csv = TRUE,
      info = FALSE)

    # Test
    test <- "Chats" %in% names(otree2)
    testthat::expect_true(test)
  })

  testthat::test_that("Import - only Time", {
    # Run function
    otree2 <- import_otree(
      del_empty = TRUE,
      path = testthat::test_path("testdata", "exp_data_5.4.0"),
      file_names = "PageTimes-2023-05-16.csv",
      onlybots = FALSE,
      csv = TRUE,
      info = FALSE)

    # Test
    test <- "Time" %in% names(otree2)
    testthat::expect_true(test)
  })

  testthat::test_that("Import - only Chats not faulty", {
    # Run function
    testthat::expect_message(
      otree2 <- import_otree(
        del_empty = TRUE,
        path = testthat::test_path("testdata"),
        file_names = c(
          file.path("exp_data_5.4.0", "all_apps_wide-2900-05-16.csv"),
          file.path("exp_data_5.4.0", "ChatMessages-2023-05-16.csv"),
          file.path("exp_data_5.4.0", "PageTimes-2900-05-16.csv")
        ),
        onlybots = FALSE,
        csv = TRUE,
        info = TRUE),
      "Imported: 0 app.*No Time fil.*Imported: Chat file.*Errors when importi")

    # Test
    test0 <- !is.null(otree2$info)
    test1 <- !("initial_n" %in% names(otree2$info))  # Not available without AAW
    test2 <- length(otree2$info$imported_files) == 1L
    test3 <- ("Chats" %in% names(otree2))
    testthat::expect_true(all(c(test0, test1, test2, test3)))
  })

  testthat::test_that("Import - only TIME not faulty", {
    # Run function
    testthat::expect_message(
      otree2 <- import_otree(
        del_empty = TRUE,
        testthat::test_path("testdata"),
        file_names = c(
          file.path("exp_data_5.4.0", "all_apps_wide-2900-05-16.csv"),
          file.path("exp_data_5.4.0", "ChatMessages-2090-05-16.csv"),
          file.path("exp_data_5.4.0", "PageTimes-2023-05-16.csv"),
          file.path("exp_data_5.4.0", "PageTimes-2900-05-16.csv")
        ),
        onlybots = FALSE,
        csv = TRUE,
        info = TRUE),
      "Imported: 0 app.*Imported: Time fil.*No chat files available.*Errors wh")

    # Test
    test1 <- !("initial_n" %in% names(otree2$info))  # Not available without AAW
    test2 <- length(otree2$info$imported_files) == 1L
    test3 <- ("Time" %in% names(otree2))
    testthat::expect_true(all(c(test1, test2, test3)))
  })

  testthat::test_that("Import - with some faulty file_names", {
    # Run function
    message <- capture_messages(
      otree2 <- import_otree(
        del_empty = TRUE,
        path = testthat::test_path("testdata"),
        file_names = c(
          file.path("exp_data_5.4.0", "all_apps_wide-2023-05-16.csv"),
          file.path("exp_data_5.4.0", "all_apps_wide-2023-05-96.csv"),  # -
          file.path("exp_data_5.4.0", "dictator_2023-05-16.csv"),
          file.path("exp_data_5.4.0", "ChatMessages-2900-05-16.csv"),   # -
          file.path("exp_data_5.4.0", "ChatMessages-2900-05-26.csv"),   # -
          file.path("exp_data_5.4.0", "PageTimes-2900-05-16.csv"),      # -
          file.path("exp_data_5.4.0", "PageTimes-2901-05-16.csv"),      # -
          file.path("exp_data_5.4.0", "PageTimes-2023-05-16.csv"),
          file.path("exp_data_5.4.0", "ChatMessages-2023-05-16.csv")
        ),
        onlybots = FALSE,
        csv = TRUE,
        info = TRUE))

    testthat::expect_true(
      grepl(pattern = "Imported:.*Errors when importing.*cannot open the conne",
            x = message)
    )

    # Test
    test1 <- ("initial_n" %in% names(otree2$info))
    test2 <- length(otree2$info$imported_files) == 4L
    test3 <- "dictator" %in% names(otree2)
    test4 <- "Chats" %in% names(otree2)
    test5 <- "Time" %in% names(otree2)
    test6 <- "all_apps_wide" %in% names(otree2)
    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6)))
  })

  testthat::test_that("Import - with file_names(path included)", {
    # Run function
    message <- capture_messages(
      otree2 <- import_otree(
        del_empty = TRUE,
        file_names = c("testdata/exp_data_5.4.0/all_apps_wide-2023-05-16.csv",
                       "testdata/exp_data_5.4.0/ChatMessages-2023-05-16.csv",
                       "testdata/exp_data_5.4.0/PageTimes-2023-05-16.csv"),
        onlybots = FALSE,
        csv = TRUE,
        info = TRUE))

    testthat::expect_true(
      grepl(pattern = "Imported",
            x = message))

    # Test
    testthat::expect_output(str(otree2), "List of 4")
    test1 <- ("initial_n" %in% names(otree2$info))
    test2 <- length(otree2$info$imported_files) == 3L
    testthat::expect_true(test1)
    testthat::expect_true(test2)
  })

  testthat::test_that("Import - specific csv without all apps wide", {
    file_names <- c(
      "dictator_2023-03-27.csv",
      "ChatMessages-2023-03-27.csv",
      "PageTimes-2023-03-27.csv")

    # Run function
    otree2 <- import_otree(
      del_empty = TRUE,
      path = testthat::test_path("testdata", "exp_data"),
      file_names = file_names,
      onlybots = FALSE,
      csv = TRUE,
      recursive = TRUE,
      info = FALSE)

    # Test
    testthat::expect_output(str(otree2), "List of 4")
    # Test if there is no initial_n (should be omitted if there is no aaw!)
    test1 <- !("initial_n" %in% names(otree2$info))
    testthat::expect_true(test1)
    test2 <- length(otree2$info$imported_files) == length(file_names)
    testthat::expect_true(test2)
  })

  testthat::test_that("Import - without all apps wide xlsx", {
    file_names <- c(
      "dictator_2023-05-16.xlsx",
      "Chat-messages-(accessed-2023-05-16).csv",
      "TimeSpent-(accessed-2023-05-16).csv")

    # Run function
    otree2 <- import_otree(
      del_empty = TRUE,
      path = testthat::test_path("testdata", "exp_data_2.1.0"),
      file_names = file_names,
      onlybots = FALSE,
      csv = FALSE,
      recursive = TRUE,
      info = FALSE)

    # Test
    testthat::expect_output(str(otree2), "List of 4")
    # Test if there is no initial_n (should be omitted if there is no aaw!)
    test1 <- !("initial_n" %in% names(otree2$info))
    test2 <- length(otree2$info$imported_files) == length(file_names)
    test3 <- "dictator" %in% names(otree2)
    test4 <- "Chats" %in% names(otree2)
    test5 <- "Time" %in% names(otree2)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5)))
  })

  testthat::test_that("Import - with file names", {
    file_names <- c("all_apps_wide-2023-03-27.csv",
                    "ChatMessages-2023-03-27.csv",
                    "PageTimes-2023-03-27.csv")

    # Run function
    otree2 <- import_otree(
      del_empty = TRUE,
      path = testthat::test_path("testdata", "exp_data"),
      file_names = file_names,
      onlybots = FALSE,
      csv = TRUE,
      info = FALSE)

    # Test
    testthat::expect_output(str(otree2), "List of 4")
    test1 <- "initial_n" %in% names(otree2$info)
    test2 <- length(otree2$info$imported_files) == length(file_names)
    test3 <- "all_apps_wide" %in% names(otree2)
    test4 <- "Chats" %in% names(otree2)
    test5 <- "Time" %in% names(otree2)
    testthat::expect_true(all(c(test1, test3, test4, test5)))
  })

  testthat::test_that("Import (e) - no files", {
    # Run function and test
    testthat::expect_error(import_otree(
      del_empty = TRUE,
      path =  testthat::test_path("testdata", "empty")
    ), "No files to import")
  })

  testthat::test_that("Import (e) - file_names(empty path)", {
    # Run function
    testthat::expect_error(
      otree2 <- import_otree(
        del_empty = TRUE,
        path = NULL,
        file_names = c(
          file.path("exp_data_5.4.0", "all_apps_wide-2023-05-16.csv"),
          file.path("exp_data_5.4.0", "ChatMessages-2023-05-16.csv"),
          file.path("exp_data_5.4.0", "PageTimes-2023-05-16.csv")
        ),
        onlybots = FALSE,
        csv = TRUE,
        info = TRUE), "Path must not be NULL!")
  })

  testthat::test_that("Import (e) - csv - all faulty file_names", {
    # Run function and test
    # This error message is only shown because all of them are faulty

    testthat::expect_error(
      otree2 <- import_otree(
        del_empty = TRUE,
        path = testthat::test_path("testdata"),
        file_names = c("exp_data_5.4.0/all_apps_wide-2900-05-16.csv",
                       "exp_data_5.4.0/ChatMessages-2900-05-16.csv",
                       "exp_data_5.4.0/PageTimes-2900-05-16.csv"),
        onlybots = FALSE,
        csv = TRUE,
        info = TRUE), "Errors when importing these files")
  })

  testthat::test_that("Import (e) - xlsx - all faulty file_names", {
    # Run function and test
    # This error message is only shown because all of them are faulty

    testthat::expect_error(
      otree2 <- import_otree(
        del_empty = TRUE,
        path = testthat::test_path("testdata"),
        file_names = c(
          file.path("exp_data_5.4.0", "all_apps_wide-2900-05-16.xlsx"),
          file.path("exp_data_5.4.0", "dictator-2900-05-16.xlsx"),
          file.path("exp_data_5.4.0", "ChatMessages-2900-05-16.csv"),
          file.path("exp_data_5.4.0", "PageTimes-2900-05-16.csv")
        ),
        onlybots = FALSE,
        csv = FALSE,
        info = TRUE), "Errors when importing these files")
  })

  testthat::test_that("Import (e) - xlsx - some faulty file_names", {
    # Run function
    testthat::expect_message(
      otree2 <- import_otree(
        del_empty = TRUE,
        path = "testdata",
        file_names = c(
          file.path(".", "exp_data_2.1.0",
                    "all_apps_wide-2900-05-16.xlsx"),
          file.path(".", "exp_data_2.1.0",
                    "all_apps_wide_2023-05-16.xlsx"),
          file.path(".", "exp_data_2.1.0",
                    "dictator_2023-05-16.xlsx"),
          file.path(".", "exp_data_2.1.0",
                    "dictator-2900-05-16.xlsx"),
          file.path(".", "exp_data_2.1.0",
                    "start-2900-05-16.xlsx"),
          file.path(".", "exp_data_2.1.0",
                    "ChatMessages-2900-05-16.csv"),
          file.path(".", "exp_data_2.1.0",
                    "Chat-messages-(accessed-2023-05-16).csv"),
          file.path(".", "exp_data_2.1.0",
                    "TimeSpent-(accessed-2023-05-16).csv"),
          file.path(".", "exp_data_2.1.0",
                    "PageTimes-2900-05-16.csv")
        ),
        onlybots = FALSE,
        csv = FALSE,
        info = TRUE), "Errors when importing these files")

    # Test
    test1 <- !("start" %in% names(otree2))
    test2 <- "dictator" %in% names(otree2)
    test3 <- "Time" %in% names(otree2)
    test4 <- "Chats" %in% names(otree2)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("Import (w) - erroneous files", {
    # Dictator file is faulty

    errormessage <-
      paste0("Errors when importing these.*",
             "dictator_2023-03-27.csv")

    # Run function
    testthat::expect_warning(
      testthat::expect_message(
        otree2 <- import_otree(
          info = TRUE,
          path =  testthat::test_path("testdata", "exp_wrong_data")),
        errormessage),
      "stored all_apps_wide globally but also room-specific")

    # Test
    test2 <- "survey" %in% names(otree2)
    test3 <- !("dictator" %in% names(otree2))
    test4 <- "Chats" %in% names(otree2)
    test5 <- "Time" %in% names(otree2)
    test6 <- "all_apps_wide" %in% names(otree2)
    test7 <- !(any(grepl("dictator", otree2$info$imported_files)))
    testthat::expect_true(all(c(test2, test3, test4, test5, test6, test7)))
  })

  testthat::test_that("Import (e) - path", {
    # Run function and test
    testthat::expect_error(import_otree(
      del_empty = TRUE,
      path = "xyz",
      onlybots = FALSE,
      csv = TRUE,
      info = TRUE), "This path does not exist")
  })

  print("---- delete_duplicate -----")

  # Delete duplicate  ####
  testthat::test_that("Delete duplicate - time and chat", {
    # Prepare data
    otree2 <- otree_all

    otree2$all_apps_wide <- rbind(otree2$all_apps_wide,
                                  otree2$all_apps_wide)
    otree2$dictator <- rbind(otree2$dictator,
                             otree2$dictator)
    otree2$survey <- rbind(otree2$survey,
                           otree2$survey)
    otree2$Time <- rbind(otree2$Time,
                         otree2$Time)
    otree2$Chats <- rbind(otree2$Chats,
                          otree2$Chats)

    # Before
    n_before_aaw <- nrow(otree2$all_apps_wide)
    n_before_dictator <- nrow(otree2$dictator)
    n_before_survey <- nrow(otree2$survey)
    n_before_survey <- nrow(otree2$Time)
    n_before_chat <- nrow(otree2$Chats)
    n_before_custom <- nrow(otree2$custexp_dictator)
    before_n <- otree2$info$initial_n

    # Run function
    otree2 <- delete_duplicate(otree2)

    # Test
    n_after_aaw <- nrow(otree2$all_apps_wide)
    n_after_dictator <- nrow(otree2$dictator)
    after_n <- otree2$info$initial_n
    n_after_custom <- nrow(otree2$custexp_dictator)

    testthat::expect_gt(n_before_aaw, n_after_aaw)
    testthat::expect_gt(n_before_dictator, n_after_dictator)
    testthat::expect_gt(before_n, after_n)
    testthat::expect_equal(n_before_custom, n_after_custom)
  })

  testthat::test_that("Delete duplicate", {
    # Prepare data
    testthat::expect_warning(
      otree2 <- import_otree(
        del_empty = TRUE,
        path =  testthat::test_path("testdata", "exp_data_5.4.0"),
        onlybots = FALSE,
        csv = TRUE,
        info = FALSE))
    # Alternative: # file.path(".", "exp_data_5.4.0"),

    n_before_aaw <- nrow(otree2$all_apps_wide)
    n_before_dictator <- nrow(otree2$dictator)
    n_before_custom_dictator <- nrow(otree2$custexp_dictator)
    before_n <- otree2$info$initial_n

    # Run function
    otree2 <- delete_duplicate(otree2)

    # Test
    n_after_aaw <- nrow(otree2$all_apps_wide)
    n_after_dictator <- nrow(otree2$dictator)
    n_after_custom_dictator <- nrow(otree2$custexp_dictator)

    after_n <- otree2$info$initial_n
    testthat::expect_gt(n_before_aaw, n_after_aaw)
    testthat::expect_gt(n_before_dictator, n_after_dictator)
    testthat::expect_equal(n_before_custom_dictator, n_after_custom_dictator)

    testthat::expect_gt(before_n, after_n)

    # Test if nothing is deleted from custom export
    testthat::expect_true(nrow(otree2$custexp_dictator) == 8L)
  })

  print("---- messy_time -----")

  # Messy time ####
  testthat::test_that("Messy time", {
    # Prepare data
    otree2 <- otree_all

    # Run function and test (combine only time stamps)
    testthat::expect_warning(
      otree2 <- messy_time(otree2,
                           combine = TRUE,
                           epoch_time = TRUE,
                           info = TRUE),
      "referred to the time stamp.*referred to the participant code")

    test1 <- !("epoch_time" %in% names(otree2$Time))
    test2 <- !("time_stamp" %in% names(otree2$Time))
    test3 <- !("participant__code" %in% names(otree2$Time))
    testthat::expect_true(all(c(test1, test2, test3)))
  })

  # The other messy tests are below inside the other functions tests
  testthat::test_that("Messy time", {
    # Prepare data
    otree2 <- otree_all

    # Run function and test
    testthat::expect_error(
      messy_time(otree2),
      "referred to the time stamp.*referred to the participant code")
  })

  testthat::test_that("Messy time", {
    # Prepare data
    otree2 <- otree_all

    # Run function and test
    testthat::expect_error(messy_time(otree2),
                           "referred to the time stamp")
  })

  testthat::test_that("Messy time - combine false, epoch time false", {
    # Prepare data
    otree2 <- otree_all

    # Run function and test (combine only time stamps
    testthat::expect_error(messy_time(otree2,
                                      combine = FALSE,
                                      epoch_time = FALSE),
                           "referred to the participant code")
  })

  print("---- messy_chat -----")

  # Messy chat  ####
  testthat::test_that("Messy chat", {
    # Prepare data
    otree2 <- otree_all

    # Run function and test
    testthat::expect_error(messy_chat(otree2),
                           " referred to the session code")
  })

  testthat::test_that("Messy chat - combine", {
    # Prepare data
    otree2 <- otree_all

    # Run function and test
    testthat::expect_warning(
      otree2 <- messy_chat(otree2,
                           combine = TRUE,
                           info = TRUE),
      "referred to")
  })

  testthat::test_that("Messy chat (e) - more participant code variables", {
    # Prepare data
    otree2 <- otree_all

    # Run function and test
    testthat::expect_error(messy_chat(otree2,
                                      session = FALSE),
                           "referred to the participant code")
  })

  print("---- delete_cases -----")

  # Delete cases  ####
  testthat::test_that("Delete cases - new oTree", {
    # Prepare data
    otree2 <- otree_5_4_0
    person <- otree2$all_apps_wide$participant.code[1L]

    # Before
    n_before_aaw <- nrow(otree2$all_apps_wide)
    n_before_dictator <- nrow(otree2$dictator)
    n_before_survey <- nrow(otree2$survey)
    n_before_survey <- nrow(otree2$Time)
    n_before_chat <- nrow(otree2$Chats)

    # Test if nothing is deleted from custom export
    testthat::expect_true("custexp_dictator" %in% names(otree2))
    testthat::expect_true(nrow(otree2$custexp_dictator) == 8L)

    # Run function and test
    testthat::expect_message(
      otree2 <- delete_cases(otree2,
                   person,
                   reason = "Upon request",
                   info = TRUE),
      "Cases are deleted")

    # After
    n_after_aaw <- nrow(otree2$all_apps_wide)
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)
    n_after_export_dictator <- nrow(otree2$custexp_dictator)

    # Test if nothing is deleted from custom export
    testthat::expect_true("custexp_dictator" %in% names(otree2))
    testthat::expect_true(nrow(otree2$custexp_dictator) == 8L)

    # Diff
    diff_aaw <- n_before_aaw - n_after_aaw
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_survey - n_after_time
    diff_chat <- n_before_chat - n_after_chat

    # Test difference
    testthat::expect_gt(diff_aaw, 0L)
    testthat::expect_gt(diff_dictator, 0L)
    testthat::expect_gt(diff_survey, 0L)
    testthat::expect_gt(diff_time, 0L)
    testthat::expect_identical(diff_chat, 0L)

    # Test if not all cases were deleted!
    testthat::expect_gt(n_after_aaw, 0L)
    testthat::expect_gt(n_after_dictator, 0L)
    testthat::expect_gt(n_after_survey, 0L)
    testthat::expect_gt(n_after_time, 0L)
    testthat::expect_gt(n_after_chat, 0L)
    testthat::expect_gt(n_after_export_dictator, 0L)

    # Test if deleted people are really deleted
    test0 <- length(otree2$info[["deleted_cases"]][["codes"]]) == 1L
    test1 <- person %in% otree2$info[["deleted_cases"]][["codes"]]
    test2 <- !any(otree2$info[["deleted_cases"]][["codes"]] %in%
                    unique(otree2$Time$participant_code))
    test3 <- !any(otree2$info[["deleted_cases"]][["codes"]] %in%
                    unique(otree2$all_apps_wide$participant.code))
    testthat::expect_true(test0)
    testthat::expect_true(test1)
    testthat::expect_true(test2)
    testthat::expect_true(test3)

    # Test if participant is really deleted - version 2
    test1 <- !(person %in% otree2$all_apps_wide$participant.code)
    test2 <- !(person %in% otree2$dictator$participant.code)
    test3 <- !(person %in% otree2$start$participant.code)
    test4 <- !(person %in% otree2$survey$participant.code)
    test5 <- !(person %in% otree2$Time$participant__code)
    test6 <- !(person %in% otree2$Chats$participant__code)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5, test6)))

    # Test for consistency
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)

    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count

    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("Delete cases - new oTree, one random data frame", {
    # Prepare data
    otree2 <- otree_5_4_0
    person <- otree2$all_apps_wide$participant.code[1L]
    otree2$random_dataframe <- data.frame(
      a = c(1L, 2L, 3L),
      b = c(4L, 5L, 6L),
      c = c(7L, 8L, 9L))

    # Before
    n_before_aaw <- nrow(otree2$all_apps_wide)
    n_before_dictator <- nrow(otree2$dictator)
    n_before_survey <- nrow(otree2$survey)
    n_before_survey <- nrow(otree2$Time)
    n_before_chat <- nrow(otree2$Chats)
    before_random <- nrow(otree2$random_dataframe)

    # Run function and test
    testthat::expect_message(
      delete_cases(otree2,
                   person,
                   reason = "Upon request",
                   info = TRUE),
      "Cases are deleted")
    otree2 <- delete_cases(otree2, person, reason = "Upon request")

    # After
    n_after_aaw <- nrow(otree2$all_apps_wide)
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)
    n_after_random <- nrow(otree2$random_dataframe)

    # Diff
    diff_aaw <- n_before_aaw - n_after_aaw
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_survey - n_after_time
    diff_chat <- n_before_chat - n_after_chat
    diff_random <- before_random - n_after_random

    # Test difference
    testthat::expect_gt(diff_aaw, 0L)
    testthat::expect_gt(diff_dictator, 0L)
    testthat::expect_gt(diff_survey, 0L)
    testthat::expect_gt(diff_time, 0L)
    testthat::expect_identical(diff_chat, 0L)
    testthat::expect_identical(diff_random, 0L)

    # Test if not all cases were deleted!
    testthat::expect_gt(n_after_aaw, 0L)
    testthat::expect_gt(n_after_dictator, 0L)
    testthat::expect_gt(n_after_survey, 0L)
    testthat::expect_gt(n_after_time, 0L)
    testthat::expect_gt(n_after_chat, 0L)
    testthat::expect_gt(n_after_random, 0L)

    # Test if deleted people are really deleted
    test0 <- length(otree2$info[["deleted_cases"]][["codes"]]) == 1L
    test1 <- person %in% otree2$info[["deleted_cases"]][["codes"]]
    test2 <- !any(otree2$info[["deleted_cases"]][["codes"]] %in%
                    unique(otree2$Time$participant_code))
    test3 <- !any(otree2$info[["deleted_cases"]][["codes"]] %in%
                    unique(otree2$all_apps_wide$participant.code))
    testthat::expect_true(test0)
    testthat::expect_true(test1)
    testthat::expect_true(test2)
    testthat::expect_true(test3)

    # Test if participant is really deleted - version 2
    test1 <- !(person %in% otree2$all_apps_wide$participant.code)
    test2 <- !(person %in% otree2$dictator$participant.code)
    test3 <- !(person %in% otree2$start$participant.code)
    test4 <- !(person %in% otree2$survey$participant.code)
    test5 <- !(person %in% otree2$Time$participant__code)
    test6 <- !(person %in% otree2$Chats$participant__code)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5, test6)))

    # Test for consistency
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)

    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("Delete cases - old and new otree", {
    # Prepare data (delete person from old and new data frame)
    otree2 <- otree_all
    person1 <- otree2$Time$participant_code[
      !is.na(otree2$Time$participant_code)][1L]
    person2 <- otree2$Time$participant__code[
      !is.na(otree2$Time$participant__code)][1L]
    person <- c(person1, person2)

    # Before
    n_before_aaw <- nrow(otree2$all_apps_wide)
    n_before_dictator <- nrow(otree2$dictator)
    n_before_survey <- nrow(otree2$survey)
    n_before_survey <- nrow(otree2$Time)
    n_before_chat <- nrow(otree2$Chats)

    # Run function and test
    otree2 <- messy_time(otree2, combine = TRUE)
    otree2 <- messy_chat(otree2, combine = TRUE)
    testthat::expect_message(
      otree2 <- delete_cases(otree2,
                             person,
                             reason = "Upon request",
                             info = TRUE),
      "2 case")

    # After
    n_after_aaw <- nrow(otree2$all_apps_wide)
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)

    # Diff
    diff_aaw <- n_before_aaw - n_after_aaw
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_survey - n_after_time
    diff_chat <- n_before_chat - n_after_chat

    # Test difference
    testthat::expect_gt(diff_aaw, 0L)
    testthat::expect_gt(diff_dictator, 0L)
    testthat::expect_gt(diff_survey, 0L)
    testthat::expect_gt(diff_time, 0L)
    testthat::expect_identical(diff_chat, 0L)

    # Test if not all cases were deleted!
    testthat::expect_gt(n_after_aaw, 0L)
    testthat::expect_gt(n_after_dictator, 0L)
    testthat::expect_gt(n_after_survey, 0L)
    testthat::expect_gt(n_after_time, 0L)
    testthat::expect_gt(n_after_chat, 0L)

    # Test if deleted people are really deleted (sample)
    test1 <- all(person %in% otree2$info[["deleted_cases"]][["codes"]])
    test2 <- !any(otree2$info[["deleted_cases"]][["codes"]] %in%
                    unique(otree2$Time$participant_code[
                      !is.na(otree2$Time$participant_code)]))

    test3 <- !any(otree2$info[["deleted_cases"]][["codes"]] %in%
                    unique(otree2$all_apps_wide$participant.code))
    testthat::expect_true(test1)
    testthat::expect_true(test2)
    testthat::expect_true(test3)

    test1 <- length(otree2$info[["deleted_cases"]][["codes"]]) == 2L
    testthat::expect_true(test1)

    # Test if participant is really deleted - version 2
    test1 <- !(person %in% otree2$all_apps_wide$participant.code)
    test2 <- !(person %in% otree2$dictator$participant.code)
    test3 <- !(person %in% otree2$start$participant.code)
    test4 <- !(person %in% otree2$survey$participant.code)
    test5 <- !(person %in% otree2$Time$participant__code)
    test6 <- !(person %in% otree2$Chats$participant__code)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5, test6)))

    # Test for consistency
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)

    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)

    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("Delete cases - more people ", {
    # Prepare data
    otree2 <- otree_5_4_0
    person <- otree2$all_apps_wide$participant.code[c(1L, 2L, 3L, 4L)]

    # Before
    n_before_aaw <- nrow(otree2$all_apps_wide)
    n_before_dictator <- nrow(otree2$dictator)
    n_before_survey <- nrow(otree2$survey)
    n_before_survey <- nrow(otree2$Time)
    n_before_chat <- nrow(otree2$Chats)

    # Run function
    otree2 <- delete_cases(otree2,
                           person,
                           reason = "Upon request")

    # After
    n_after_aaw <- nrow(otree2$all_apps_wide)
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)

    # Diff
    diff_aaw <- n_before_aaw - n_after_aaw
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_survey - n_after_time
    diff_chat <- n_before_chat - n_after_chat

    # Test: Nothing should be deleted
    testthat::expect_gt(diff_aaw, 0L)
    testthat::expect_gt(diff_dictator, 0L)
    testthat::expect_gt(diff_survey, 0L)
    testthat::expect_gt(diff_time, 0L)
    testthat::expect_identical(diff_chat, 0L)

    # Test if deleted people are really deleted (sample)
    test1 <- all(
      person %in% otree2$info[["deleted_cases"]][["codes"]])
    test2 <- !any(otree2$info[["deleted_cases"]][["codes"]] %in%
                    unique(otree2$Time$participant_code))

    test3 <- !any(otree2$info[["deleted_cases"]][["codes"]] %in%
                    unique(otree2$all_apps_wide$participant.code))
    testthat::expect_true(test1)
    testthat::expect_true(test2)
    testthat::expect_true(test3)

    # Test if participant is really deleted - version 2
    test1 <- !(person %in% otree2$all_apps_wide$participant.code)
    test2 <- !(person %in% otree2$dictator$participant.code)
    test3 <- !(person %in% otree2$start$participant.code)
    test4 <- !(person %in% otree2$survey$participant.code)
    test5 <- !(person %in% otree2$Time$participant__code)
    test6 <- !(person %in% otree2$Chats$participant__code)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5, test6)))

    # Test for consistency
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)

    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))

    # Test if nothing is deleted from custom export
    testthat::expect_true("custexp_dictator" %in% names(otree2))
    testthat::expect_true(nrow(otree2$custexp_dictator) == 8L)

  })

  testthat::test_that("Delete cases - more people - one not there", {
    # Prepare data
    otree2 <- otree_5_4_0
    person <- c(otree2$all_apps_wide$participant.code[c(1L, 2L, 3L, 4L)],
                "notthere")

    # Before
    n_before_aaw <- nrow(otree2$all_apps_wide)
    n_before_dictator <- nrow(otree2$dictator)
    n_before_survey <- nrow(otree2$survey)
    n_before_survey <- nrow(otree2$Time)
    n_before_chat <- nrow(otree2$Chats)

    # Run function
    otree2 <- delete_cases(otree2,
                           person,
                           reason = "Upon request")

    # After
    n_after_aaw <- nrow(otree2$all_apps_wide)
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)

    # Diff
    diff_aaw <- n_before_aaw - n_after_aaw
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_survey - n_after_time
    diff_chat <- n_before_chat - n_after_chat

    # Test difference
    testthat::expect_gt(diff_aaw, 0L)
    testthat::expect_gt(diff_dictator, 0L)
    testthat::expect_gt(diff_survey, 0L)
    testthat::expect_gt(diff_time, 0L)
    testthat::expect_identical(diff_chat, 0L)

    # Test if not all cases were deleted!
    testthat::expect_gt(n_after_aaw, 0L)
    testthat::expect_gt(n_after_dictator, 0L)
    testthat::expect_gt(n_after_survey, 0L)
    testthat::expect_gt(n_after_time, 0L)
    testthat::expect_gt(n_after_chat, 0L)

    # Test if deleted people are really deleted (sample)
    test1 <- all(
      person[person != "notthere"] %in%
        otree2$info[["deleted_cases"]][["codes"]])

    test2 <- !any(otree2$info[["deleted_cases"]][["codes"]] %in%
                    unique(otree2$Time$participant_code))

    test3 <- !any(otree2$info[["deleted_cases"]][["codes"]] %in%
                    unique(otree2$all_apps_wide$participant.code))
    testthat::expect_true(test1)
    testthat::expect_true(test2)
    testthat::expect_true(test3)

    # Test if participant is really deleted - version 2
    test1 <- !(person %in% otree2$all_apps_wide$participant.code)
    test2 <- !(person %in% otree2$dictator$participant.code)
    test3 <- !(person %in% otree2$start$participant.code)
    test4 <- !(person %in% otree2$survey$participant.code)
    test5 <- !(person %in% otree2$Time$participant__code)
    test6 <- !(person %in% otree2$Chats$participant__code)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5, test6)))

    # Test for consistency
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)

    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("Delete cases - person not in aaw", {
    # Prepare data
    otree1 <- otree_5_4_0
    person <- otree1$all_apps_wide$participant.code[1L]
    otree1$all_apps_wide <- tail(otree1$all_apps_wide, -1L)

    # Before
    n_before_aaw <- nrow(otree1$all_apps_wide)
    n_before_dictator <- nrow(otree1$dictator)
    n_before_survey <- nrow(otree1$survey)
    n_before_survey <- nrow(otree1$Time)
    n_before_chat <- nrow(otree1$Chats)

    # Run function
    otree2 <- delete_cases(otree1, person,
                           reason = "Upon request")

    # After
    n_after_aaw <- nrow(otree2$all_apps_wide)
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)

    # Diff
    diff_aaw <- n_before_aaw - n_after_aaw
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_survey - n_after_time
    diff_chat <- n_before_chat - n_after_chat

    # Test difference
    testthat::expect_identical(diff_aaw, 0L)
    testthat::expect_gt(diff_dictator, 0L)
    testthat::expect_gt(diff_survey, 0L)
    testthat::expect_gt(diff_time, 0L)
    testthat::expect_identical(diff_chat, 0L)

    # Test if not all cases were deleted!
    testthat::expect_gt(n_after_aaw, 0L)
    testthat::expect_gt(n_after_dictator, 0L)
    testthat::expect_gt(n_after_survey, 0L)
    testthat::expect_gt(n_after_time, 0L)
    testthat::expect_gt(n_after_chat, 0L)

    # Test if deleted people are really deleted
    test1 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$all_apps_wide$participant.code)
    test2 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$dictator$participant.code)
    test3 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$survey$participant.code)
    test4 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$Time$participant_code)
    test5a <- otree1$Chats$participant_code %in%
      otree2$info$deleted_cases$codes  # Chats differently: Before
    test5b <- otree2$Chats$participant_code %in%
      otree2$info$deleted_cases$codes # Chats differently: After

    testthat::expect_true(all(c(test1, test2)))
    testthat::expect_true(all(c(test3, test4)))
    testthat::expect_identical(test5a, test5b)

    # Test if participant is really deleted - version 2
    test1 <- !(person %in% otree2$all_apps_wide$participant.code)
    test2 <- !(person %in% otree2$dictator$participant.code)
    test3 <- !(person %in% otree2$start$participant.code)
    test4 <- !(person %in% otree2$survey$participant.code)
    test5 <- !(person %in% otree2$Time$participant__code)
    test6 <- !(person %in% otree2$Chats$participant__code)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5, test6)))

    # Test for consistency
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)

    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("Delete cases - without aaw", {
    # Prepare data
    otree2 <- otree_5_4_0
    person <- otree2$all_apps_wide$participant.code[1L]
    otree2$all_apps_wide <- NULL

    # Before
    n_before_dictator <- nrow(otree2$dictator)
    n_before_survey <- nrow(otree2$survey)
    n_before_survey <- nrow(otree2$Time)
    n_before_chat <- nrow(otree2$Chats)

    # Run function
    otree2 <- delete_cases(otree2,
                           pcodes = person,
                           reason = "Upon request")

    # After
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)

    # Diff
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_survey - n_after_time
    diff_chat <- n_before_chat - n_after_chat

    # Test difference
    testthat::expect_gt(diff_dictator, 0L)
    testthat::expect_gt(diff_survey, 0L)
    testthat::expect_gt(diff_time, 0L)
    testthat::expect_identical(diff_chat, 0L)

    # Test if not all cases were deleted!
    testthat::expect_gt(n_after_dictator, 0L)
    testthat::expect_gt(n_after_survey, 0L)
    testthat::expect_gt(n_after_time, 0L)
    testthat::expect_gt(n_after_chat, 0L)

    # Test if deleted people are really deleted (sample)
    test1 <- person %in% otree2$info[["deleted_cases"]][["codes"]]
    test2 <- !any(otree2$info[["deleted_cases"]][["codes"]] %in%
                    unique(otree2$Time$participant_code))

    test3 <- !any(otree2$info[["deleted_cases"]][["codes"]] %in%
                    unique(otree2$dictator$participant.code))
    testthat::expect_true(test1)
    testthat::expect_true(test2)
    testthat::expect_true(test3)

    # Test if participant is really deleted - version 2
    test2 <- !(person %in% otree2$dictator$participant.code)
    test3 <- !(person %in% otree2$start$participant.code)
    test4 <- !(person %in% otree2$survey$participant.code)
    test5 <- !(person %in% otree2$Time$participant__code)
    test6 <- !(person %in% otree2$Chats$participant__code)
    testthat::expect_true(all(c(test2, test3, test4, test5, test6)))

    # Test for consistency
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)

    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))

    # Test if nothing is deleted from custom export
    testthat::expect_true("custexp_dictator" %in% names(otree2))
    testthat::expect_true(nrow(otree2$custexp_dictator) == 8L)
  })

  testthat::test_that("Delete cases - plabels", {
    # Prepare data
    otree1 <- otree_5_4_0
    person <- c("Person4", "Person1")
    person_codes <- otree1$all_apps_wide$participant.code[
      otree1$all_apps_wide$participant.label %in% person]

    # Before
    n_before_aaw <- nrow(otree1$all_apps_wide)
    n_before_dictator <- nrow(otree1$dictator)
    n_before_survey <- nrow(otree1$survey)
    n_before_survey <- nrow(otree1$Time)
    n_before_chat <- nrow(otree1$Chats)

    # Run function
    otree2 <- delete_cases(otree1,
                           plabels = person,
                           reason = "Only tests")

    # After
    n_after_aaw <- nrow(otree2$all_apps_wide)
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)

    # Diff
    diff_aaw <- n_before_aaw - n_after_aaw
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_survey - n_after_time
    diff_chat <- n_before_chat - n_after_chat

    # Test difference
    testthat::expect_gt(diff_aaw, 0L)
    testthat::expect_gt(diff_dictator, 0L)
    testthat::expect_gt(diff_survey, 0L)
    testthat::expect_gt(diff_time, 0L)
    testthat::expect_identical(diff_chat, 0L)

    # Test if not all cases were deleted!
    testthat::expect_gt(n_after_aaw, 0L)
    testthat::expect_gt(n_after_dictator, 0L)
    testthat::expect_gt(n_after_survey, 0L)
    testthat::expect_gt(n_after_time, 0L)
    testthat::expect_gt(n_after_chat, 0L)

    # Test if deleted people are really deleted
    test0 <- all(person_codes %in%
                   otree2$info[["deleted_cases"]][["codes"]])
    test1 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$all_apps_wide$participant.code)
    test2 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$dictator$participant.code)
    test3 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$survey$participant.code)
    test4 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$Time$participant_code)
    test5a <- otree1$Chats$participant_code %in%
      otree2$info$deleted_cases$codes  # Chats differently: Before
    test5b <- otree2$Chats$participant_code %in%
      otree2$info$deleted_cases$codes # Chats differently: After

    testthat::expect_true(all(c(test0, test1, test2)))
    testthat::expect_true(all(c(test3, test4)))
    testthat::expect_identical(test5a, test5b)

    test1 <- length(otree2$info[["deleted_cases"]][["codes"]]) ==
      length(person_codes)
    testthat::expect_true(test1)

    # Test for consistency
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)

    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("Delete cases - plabels not character", {
    # Prepare data
    otree1 <- otree_5_4_0

    # Run function
    testthat::expect_error(
    otree2 <- delete_cases(otree1,
                           plabels = TRUE,
                           reason = "Only tests"), "must be a character")

  })

  testthat::test_that("Delete cases - pcodes not character", {
    # Prepare data
    otree1 <- otree_5_4_0

    # Run function
    testthat::expect_error(
      otree2 <- delete_cases(otree1,
                             pcodes = TRUE,
                             reason = "Only tests"), "must be a character")

  })

  testthat::test_that("Delete cases - old", {
    # Prepare data
    otree1 <- otree_2_2_4
    labels <- c("Person4", "Person1")
    person <- otree1$all_apps_wide$participant.code[
      otree1$all_apps_wide$participant.label %in% labels]

    # Before
    n_before_aaw <- nrow(otree1$all_apps_wide)
    n_before_dictator <- nrow(otree1$dictator)
    n_before_survey <- nrow(otree1$survey)
    n_before_survey <- nrow(otree1$Time)
    n_before_chat <- nrow(otree1$Chats)

    # Run function
    otree2 <- delete_cases(otree1,
                           plabels = labels,
                           reason = "Only tests")

    # After
    n_after_aaw <- nrow(otree2$all_apps_wide)
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)

    # Diff
    diff_aaw <- n_before_aaw - n_after_aaw
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_survey - n_after_time
    diff_chat <- n_before_chat - n_after_chat

    # Test difference
    testthat::expect_gt(diff_aaw, 0L)
    testthat::expect_gt(diff_dictator, 0L)
    testthat::expect_gt(diff_survey, 0L)
    testthat::expect_gt(diff_time, 0L)
    testthat::expect_identical(diff_chat, 0L) # Equal zero!!!

    # Test if not all cases were deleted!
    testthat::expect_gt(n_after_aaw, 0L)
    testthat::expect_gt(n_after_dictator, 0L)
    testthat::expect_gt(n_after_survey, 0L)
    testthat::expect_gt(n_after_time, 0L)
    testthat::expect_gt(n_after_chat, 0L)

    # Test if deleted people are really deleted
    test0a <- all(
      person %in% otree2$info[["deleted_cases"]][["codes"]])

    test0b <- length(otree2$info[["deleted_cases"]][["codes"]]) ==
      length(person)

    test1 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$all_apps_wide$participant.code)
    test2 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$dictator$participant.code)
    test3 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$survey$participant.code)
    test4 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$Time$participant_code)
    test5a <- otree1$Chats$participant_code %in%
      otree2$info$deleted_cases$codes  # Chats differently: Before
    test5b <- otree2$Chats$participant_code %in%
      otree2$info$deleted_cases$codes # Chats differently: After

    testthat::expect_true(all(c(test0a, test0b, test1, test2)))
    testthat::expect_true(all(c(test3, test4)))
    testthat::expect_identical(test5a, test5b)

    # Test if participant is really deleted - version 2
    test1 <- !(person %in% otree2$all_apps_wide$participant.code)
    test2 <- !(person %in% otree2$dictator$participant.code)
    test3 <- !(person %in% otree2$start$participant.code)
    test4 <- !(person %in% otree2$survey$participant.code)
    test5 <- !(person %in% otree2$Time$participant__code)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5)))

    # Test for consistency
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)

    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("Delete cases - saved vars", {
    # Prepare data
    otree1 <- otree_5_4_0
    person <- otree1$all_apps_wide$participant.code[1L]

    # Before
    n_before_aaw <- nrow(otree1$all_apps_wide)
    n_before_dictator <- nrow(otree1$dictator)
    n_before_survey <- nrow(otree1$survey)
    n_before_survey <- nrow(otree1$Time)
    n_before_chat <- nrow(otree1$Chats)

    # Run function
    otree2 <- delete_cases(otree1,
                           pcodes = person,
                           reason = "Upon request",
                           saved_vars = "dictator.1.group.id_in_subsession")

    # After
    n_after_aaw <- nrow(otree2$all_apps_wide)
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)

    # Diff
    diff_aaw <- n_before_aaw - n_after_aaw
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_survey - n_after_time
    diff_chat <- n_before_chat - n_after_chat

    # Test difference
    testthat::expect_gt(diff_aaw, 0L)
    testthat::expect_gt(diff_dictator, 0L)
    testthat::expect_gt(diff_survey, 0L)
    testthat::expect_gt(diff_time, 0L)
    testthat::expect_identical(diff_chat, 0L)

    # Test if not all cases were deleted!
    testthat::expect_gt(n_after_aaw, 0L)
    testthat::expect_gt(n_after_dictator, 0L)
    testthat::expect_gt(n_after_survey, 0L)
    testthat::expect_gt(n_after_time, 0L)
    testthat::expect_gt(n_after_chat, 0L)

    # Test if deleted people are really deleted (sample)
    test0 <- person %in% otree2$info[["deleted_cases"]][["codes"]]

    # Test if deleted people are really deleted
    test1 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$all_apps_wide$participant.code)
    test2 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$dictator$participant.code)
    test3 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$survey$participant.code)
    test4 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$Time$participant_code)
    test5a <- otree1$Chats$participant_code %in%
      otree2$info$deleted_cases$codes  # Chats differently: Before
    test5b <- otree2$Chats$participant_code %in%
      otree2$info$deleted_cases$codes # Chats differently: After

    testthat::expect_true(all(c(test0, test1, test2)))
    testthat::expect_true(all(c(test3, test4)))
    testthat::expect_identical(test5a, test5b)

    test1 <- length(otree2$info[["deleted_cases"]][["codes"]]) == 1L
    testthat::expect_true(test1)

    # Test if participant is really deleted - version 2
    test1 <- !(person %in% otree2$all_apps_wide$participant.code)
    test2 <- !(person %in% otree2$dictator$participant.code)
    test3 <- !(person %in% otree2$start$participant.code)
    test4 <- !(person %in% otree2$survey$participant.code)
    test5 <- !(person %in% otree2$Time$participant__code)
    test6 <- !(person %in% otree2$Chats$participant__code)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5, test6)))

    # Test for consistency
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)

    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("Delete cases - old", {
    # Prepare data
    otree1 <- otree_2_2_4
    person <- otree1$all_apps_wide$participant.code[1L]

    # Before
    n_before_aaw <- nrow(otree1$all_apps_wide)
    n_before_dictator <- nrow(otree1$dictator)
    n_before_survey <- nrow(otree1$survey)
    n_before_survey <- nrow(otree1$Time)
    check_time <- person %in% otree1$Time$participant__code
    n_before_chat <- nrow(otree1$Chats)

    # Run function
    otree2 <- delete_cases(otree1, person, reason = "Upon request")

    # After
    n_after_aaw <- nrow(otree2$all_apps_wide)
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)

    # Diff
    diff_aaw <- n_before_aaw - n_after_aaw
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_survey - n_after_time
    diff_chat <- n_before_chat - n_after_chat

    # Test difference
    testthat::expect_gt(diff_aaw, 0L)
    testthat::expect_gt(diff_dictator, 0L)
    testthat::expect_gt(diff_survey, 0L)
    if (check_time) {
      testthat::expect_gt(diff_time, 0L)
    } else {
      testthat::expect_identical(diff_time, 0L)
    }
    testthat::expect_identical(diff_chat, 0L)

    # Test if not all cases were deleted!
    testthat::expect_gt(n_after_aaw, 0L)
    testthat::expect_gt(n_after_dictator, 0L)
    testthat::expect_gt(n_after_survey, 0L)
    testthat::expect_gt(n_after_time, 0L)
    testthat::expect_gt(n_after_chat, 0L)

    # Test if deleted people are really deleted
    test1 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$all_apps_wide$participant.code)
    test2 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$dictator$participant.code)
    test3 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$survey$participant.code)
    test4 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$Time$participant__code)
    test5a <- otree1$Chats$participant__code %in%
      otree2$info$deleted_cases$codes  # Chats differently: Before
    test5b <- otree2$Chats$participant__code %in%
      otree2$info$deleted_cases$codes # Chats differently: After

    testthat::expect_true(all(c(test1, test2)))
    testthat::expect_true(all(c(test3, test4)))
    testthat::expect_identical(test5a, test5b)

    test1 <- length(otree2$info[["deleted_cases"]][["codes"]]) == 1L
    testthat::expect_true(test1)

    # Test if participant is really deleted - version 2
    test1 <- !(person %in% otree2$all_apps_wide$participant.code)
    test2 <- !(person %in% otree2$dictator$participant.code)
    test3 <- !(person %in% otree2$start$participant.code)
    test4 <- !(person %in% otree2$survey$participant.code)
    test5 <- !(person %in% otree2$Time$participant__code)
    test6 <- (person %in% otree2$Chats$participant__code)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5, test6)))

    # Test for consistency
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)

    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("Delete cases (e) - old label not there", {
    # Prepare data
    otree2 <- otree_2_2_4

    # Run function and test
    testthat::expect_error(delete_cases(otree2,
                                        plabels = "xyz",
                                        reason = "Only tests"))
  })

  testthat::test_that("Delete cases (e)- person not there", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(delete_cases(otree2,
                                        "notthere",
                                        reason = "Upon request"),
                           "not in data frames")
  })

  testthat::test_that("Delete cases (e) - saved vars", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(delete_cases(otree2, "46kxib6w",
                                        reason = "Upon request",
                                        saved_vars = "wrongvars"), "not in")
  })

  testthat::test_that("Delete cases (e) - only participant code or label", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(delete_cases(otree2,
                                        pcodes = "46kxib6w",
                                        plabels = "Person1",
                                        reason = "Upon request",
                                        saved_vars = "wrongvars"),
                           "Please only specify either")
  })

  testthat::test_that("Delete cases (e) - participant not there", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(delete_cases(otree2,
                                        pcodes = "falsecode",
                                        reason = "Upon request"),
                           "not in data frames")
  })

  testthat::test_that("Delete cases (e) - no variable", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$all_apps_wide$participant.code <- NULL

    # Run function and test
    testthat::expect_error(delete_cases(otree2,
                                        plabels = "Person1",
                                        reason = "Upon request"),
                           "this function needs the variable")
  })

  testthat::test_that("Delete cases (e) - saved vars", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$all_apps_wide <- NULL

    # Run function and test
    testthat::expect_error(delete_cases(otree2, "46kxib6w",
                                        reason = "Upon request",
                                        saved_vars = "wrongvars"),
                           "only works")
  })

  testthat::test_that("Delete cases (e) - no participants", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$all_apps_wide <- NULL

    # Run function and test
    testthat::expect_error(delete_cases(otree2,
                                        reason = "Upon request",
                                        saved_vars = "wrongvars"),
                           "Please specify pcodes or plabels")
  })

  testthat::test_that("Delete cases (e) - participant code NA", {
    # Prepare data
    otree2 <- otree_5_4_0
    person <- c("46kxib6w", NA)

    # Run function and test
    testthat::expect_error(delete_cases(otree2,
                                        pcodes = person,
                                        reason = "Only tests"),
                           "At least one element in pcodes is NA")
  })

  testthat::test_that("Delete cases (e) - empty participant code", {
    # Prepare data
    otree2 <- otree_5_4_0
    person <- c()  # NULL Don't remove c() from code! Necessary for the check!

    # Run function and test
    testthat::expect_error(delete_cases(otree2,
                                        pcodes = person,
                                        reason = "Only tests"),
                           "Please specify pcodes or plabels")
  })

  testthat::test_that("Delete cases (e) - really empty participant code", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(delete_cases(otree2,
                                        pcodes = erroneousinput,
                                        reason = "Only tests"),
                           "object .* not found")
  })

  testthat::test_that("Delete cases (e) - really empty participant label", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(delete_cases(otree2,
                                        plabels = erroneousinput,
                                        reason = "Only tests"),
                           "object .* not found")
  })

  testthat::test_that("Delete cases (e) - participant label NA", {
    # Prepare data
    otree2 <- otree_5_4_0
    person <- c("Person4", NA)

    # Run function and test
    testthat::expect_error(delete_cases(otree2,
                                        plabels = person,
                                        reason = "Only tests"),
                           "plabel is NA")
  })

  testthat::test_that("Delete cases (e) - not oTree", {
    x <- c(1L, 2L, 3L)
    testthat::expect_error(delete_cases(x,
                                        reason = "Only tests"),
                           "not a list of oTree")
  })

  testthat::test_that("Delete cases (e) - not otree2", {
    x <- list(a = 1L, b = 2L, c = 3L)
    testthat::expect_error(delete_cases(x,
                                        reason = "Only tests"),
                           "not a list of oTree")
  })

  testthat::test_that("Delete cases (e) - old and new otree", {
    # Prepare data (delete person from old and new data frame)
    otree2 <- otree_all
    person1 <- otree2$Time$participant_code[
      !is.na(otree2$Time$participant_code)][1L]
    person2 <- otree2$Time$participant__code[
      !is.na(otree2$Time$participant__code)][1L]

    person <- c(person1, person2)

    # Run function
    error <- tryCatch(
      delete_cases(otree2,
                   person,
                   reason = "Upon request",
                   info = TRUE),
      error = function(e) e)

    # Test
    testthat::expect_true(grepl(
      "You combined data from old and new oTree versions", error))
    testthat::expect_true(grepl(
      "messy_chat", error))
    testthat::expect_true(grepl(
      "messy_time", error))
  })

  testthat::test_that("Delete cases (e) - all but messed time done", {
    # Prepare data (delete person from old and new data frame)
    otree2 <- otree_all
    person1 <- otree2$Time$participant_code[
      !is.na(otree2$Time$participant_code)][1L]
    person2 <- otree2$Time$participant__code[
      !is.na(otree2$Time$participant__code)][1L]

    person <- c(person1, person2)

    otree2 <- messy_time(otree2, combine = TRUE)
    # Run function
    error <- tryCatch(
      delete_cases(otree2,
                   person,
                   reason = "Upon request",
                   info = TRUE),
      error = function(e) e)

    # Test
    testthat::expect_true(grepl(
      "You combined data from old and new oTree versions", error))
    testthat::expect_true(grepl(
      "messy_chat", error))
    testthat::expect_false(grepl(
      "messy_time", error))
  })

  testthat::test_that("Delete cases (e) - all but messed chat done", {
    # Prepare data (delete person from old and new data frame)
    otree2 <- otree_all
    person1 <- otree2$Time$participant_code[
      !is.na(otree2$Time$participant_code)][1L]
    person2 <- otree2$Time$participant__code[
      !is.na(otree2$Time$participant__code)][1L]
    person <- c(person1, person2)
    otree2 <- messy_chat(otree2, combine = TRUE)

    # Run function
    error <- tryCatch(
      delete_cases(otree2,
                   person,
                   reason = "Upon request",
                   info = TRUE),
      error = function(e) e)

    # Test
    testthat::expect_true(grepl(
      "You combined data from old and new oTree versions", error))
    testthat::expect_false(grepl(
      "messy_chat", error))
    testthat::expect_true(grepl(
      "messy_time", error))
  })

  print("---- show_dropouts -----")

  # Delete sessions ####

  testthat::test_that("Delete sessions - old ", {
    # Prepare data (get a session with at least 4 cases)
    otree2 <- otree_2_2_4
    session <- as.data.frame(table(otree2$all_apps_wide$session.code))
    session <- session[session$Freq >= 4L, 1L]
    part <- otree2$all_apps_wide$participant.code[
      otree2$all_apps_wide$session.code == session]

    # Before
    n_before_aaw <- nrow(otree2$all_apps_wide)
    n_before_dictator <- nrow(otree2$dictator)
    n_before_survey <- nrow(otree2$survey)
    n_before_survey <- nrow(otree2$Time)
    n_before_chat <- nrow(otree2$Chats)

    # Run function
    testthat::expect_warning(
      otree2 <- delete_sessions(otree2,
                                scodes = session,
                                reason = "Only tests"),
      "Session information is taken from the data frames")

    # After
    n_after_aaw <- nrow(otree2$all_apps_wide)
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)

    # Diff
    diff_aaw <- n_before_aaw - n_after_aaw
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_survey - n_after_time
    diff_chat <- n_before_chat - n_after_chat

    # Test
    testthat::expect_gt(diff_aaw, 0L)
    testthat::expect_gt(diff_dictator, 0L)
    testthat::expect_gt(diff_survey, 0L)
    testthat::expect_gt(diff_time, 0L)
    testthat::expect_gt(diff_chat, 0L)

    # Test if sessions are really deleted
    test1 <- !(session %in% otree2$all_apps_wide$session.code)
    test2 <- !(session %in% otree2$dictator$session.code)
    test3 <- !(session %in% otree2$start$session.code)
    test4 <- !(session %in% otree2$survey$session.code)
    test5 <- !(session %in% otree2$Chats$participant__session__code)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5)))

    # Test if participant is really deleted
    test1 <- !(part %in% otree2$all_apps_wide$participant.code)
    test2 <- !(part %in% otree2$dictator$participant.code)
    test3 <- !(part %in% otree2$start$participant.code)
    test4 <- !(part %in% otree2$survey$participant.code)
    test5 <- !(part %in% otree2$Time$participant__code)
    test6 <- !(part %in% otree2$Chats$participant__code)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5, test6)))

    # Test for consistency of the info output
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)

    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("Delete sessions - new", {
    # Prepare data (get a session with at least 4 cases)
    otree2 <- otree_5_4_0
    session <- as.data.frame(table(otree2$all_apps_wide$session.code))
    session <- session[session$Freq >= 4L, 1L]
    part <- otree2$all_apps_wide$participant.code[
      otree2$all_apps_wide$session.code == session]

    # Before
    n_before_aaw <- nrow(otree2$all_apps_wide)
    n_before_dictator <- nrow(otree2$dictator)
    n_before_survey <- nrow(otree2$survey)
    n_before_survey <- nrow(otree2$Time)
    n_before_chat <- nrow(otree2$Chats)

    # Run function
    otree2 <- delete_sessions(otree2,
                              scodes = session,
                              reason = "Only tests")
    # After
    n_after_aaw <- nrow(otree2$all_apps_wide)
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)

    # Diff
    diff_aaw <- n_before_aaw - n_after_aaw
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_survey - n_after_time
    diff_chat <- n_before_chat - n_after_chat

    # Test
    testthat::expect_gt(diff_aaw, 0L)
    testthat::expect_gt(diff_dictator, 0L)
    testthat::expect_gt(diff_survey, 0L)
    testthat::expect_gt(diff_time, 0L)
    testthat::expect_gt(diff_chat, 0L)

    # Test if participant is really deleted - version 1
    test1 <- !(part %in% otree2$all_apps_wide$participant.code)
    test2 <- !(part %in% otree2$dictator$participant.code)
    test3 <- !(part %in% otree2$start$participant.code)
    test4 <- !(part %in% otree2$survey$participant.code)
    test5 <- !(part %in% otree2$Time$participant__code)
    test6 <- !(part %in% otree2$Chats$participant__code)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5, test6)))

    # Test if deleted people are really deleted - version 2
    test1 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$all_apps_wide$participant.code)
    test2 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$dictator$participant.code)
    test3 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$survey$participant.code)
    test4 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$Time$participant_code)
    test5 <- !(otree2$Chats$participant_code %in%
                 otree2$info$deleted_cases$codes)

    testthat::expect_true(all(c(test1, test2)))
    testthat::expect_true(all(c(test3, test4)))
    testthat::expect_true(all(test5))

    # Test if deleted people are really deleted - version 3
    test1 <- !(session %in% otree2$all_apps_wide$session.code)
    test2 <- !(session %in% otree2$dictator$session.code)
    test3 <- !(session %in% otree2$start$session.code)
    test4 <- !(session %in% otree2$survey$session.code)
    test5 <- !(session %in% otree2$Time$session_code)
    test6 <- !(session %in% otree2$Chats$session_code)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5,
                                test6)))

    # Test for consistency of the info output
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)

    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))

    # Test if nothing is deleted from custom export
    testthat::expect_true("custexp_dictator" %in% names(otree2))
    testthat::expect_true(nrow(otree2$custexp_dictator) == 8L)
  })

  testthat::test_that("Delete sessions - new, one random data frame", {
    # Prepare data (get a session with at least 4 cases)
    otree2 <- otree_5_4_0
    otree2$random_dataframe <- data.frame(
      a = c(1L, 2L, 3L),
      b = c(4L, 5L, 6L),
      c = c(7L, 8L, 9L))
    session <- as.data.frame(table(otree2$all_apps_wide$session.code))
    session <- session[session$Freq >= 4L, 1L]
    part <- otree2$all_apps_wide$participant.code[
      otree2$all_apps_wide$session.code == session]

    # Before
    n_before_aaw <- nrow(otree2$all_apps_wide)
    n_before_dictator <- nrow(otree2$dictator)
    n_before_survey <- nrow(otree2$survey)
    n_before_survey <- nrow(otree2$Time)
    n_before_chat <- nrow(otree2$Chats)
    before_random <- nrow(otree2$random_dataframe)

    # Run function
    otree2 <- delete_sessions(otree2,
                              scodes = session,
                              reason = "Only tests")
    # After
    n_after_aaw <- nrow(otree2$all_apps_wide)
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)
    n_after_random <- nrow(otree2$random_dataframe)

    # Diff
    diff_aaw <- n_before_aaw - n_after_aaw
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_survey - n_after_time
    diff_chat <- n_before_chat - n_after_chat
    diff_random <- before_random - n_after_random

    # Test
    testthat::expect_gt(diff_aaw, 0L)
    testthat::expect_gt(diff_dictator, 0L)
    testthat::expect_gt(diff_survey, 0L)
    testthat::expect_gt(diff_time, 0L)
    testthat::expect_gt(diff_chat, 0L)
    testthat::expect_identical(diff_random, 0L)

    # Test if deleted people are really deleted
    test1 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$all_apps_wide$participant.code)
    test2 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$dictator$participant.code)
    test3 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$survey$participant.code)
    test4 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$Time$participant_code)
    test5 <- !(otree2$Chats$participant_code %in%
                 otree2$info$deleted_cases$codes)

    testthat::expect_true(all(c(test1, test2)))
    testthat::expect_true(all(c(test3, test4)))
    testthat::expect_true(all(test5))

    # Test if participant is really deleted - version 2
    test1 <- !(part %in% otree2$all_apps_wide$participant.code)
    test2 <- !(part %in% otree2$dictator$participant.code)
    test3 <- !(part %in% otree2$start$participant.code)
    test4 <- !(part %in% otree2$survey$participant.code)
    test5 <- !(part %in% otree2$Time$participant__code)
    test6 <- !(part %in% otree2$Chats$participant__code)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5, test6)))

    # Test if participant is really deleted - version 3
    test1 <- !(session %in% otree2$all_apps_wide$session.code)
    test2 <- !(session %in% otree2$dictator$session.code)
    test3 <- !(session %in% otree2$start$session.code)
    test4 <- !(session %in% otree2$survey$session.code)
    test5 <- !(session %in% otree2$Time$session_code)
    test6 <- !(session %in% otree2$Chats$session_code)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5,
                                test6)))

    # Test for consistency of the info output
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)

    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))

    # Test if nothing is deleted from custom export
    testthat::expect_true("custexp_dictator" %in% names(otree2))
    testthat::expect_true(nrow(otree2$custexp_dictator) == 8L)
  })

  testthat::test_that("Delete sessions - new info = TRUE", {
    # Prepare data (get a session with at least 4 cases)
    otree2 <- otree_5_4_0
    session <- as.data.frame(table(otree2$all_apps_wide$session.code))
    session <- session[session$Freq >= 4L, 1L]

    # Run function
    testthat::expect_message(
      otree2 <- delete_sessions(otree2,
                                scodes = session,
                                reason = "Only tests",
                                info = TRUE),
      "deleted")
  })

  testthat::test_that("Delete sessions - no cases", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Before
    n_before_aaw <- nrow(otree2$all_apps_wide)
    n_before_dictator <- nrow(otree2$dictator)
    n_before_survey <- nrow(otree2$survey)
    n_before_time <- nrow(otree2$Time)
    n_before_chat <- nrow(otree2$Chats)

    # Run function
    testthat::expect_warning(
      otree2 <- delete_sessions(otree2,
                                scodes = "xyz",
                                reason = "Only tests"),
      "The session can not be found in any of the data frames")

    # After
    n_after_aaw <- nrow(otree2$all_apps_wide)
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)

    # Diff
    diff_aaw <- n_before_aaw - n_after_aaw
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_time - n_after_time
    diff_chat <- n_before_chat - n_after_chat

    # Test
    testthat::expect_identical(diff_aaw, 0L)
    testthat::expect_identical(diff_dictator, 0L)
    testthat::expect_identical(diff_survey, 0L)
    testthat::expect_identical(diff_time, 0L)
    testthat::expect_identical(diff_chat, 0L)

    # Test for consistency of the info output (everything is NULL!)
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)
    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))

    # Test if nothing is deleted from custom export
    testthat::expect_true("custexp_dictator" %in% names(otree2))
    testthat::expect_true(nrow(otree2$custexp_dictator) == 8L)
  })

  testthat::test_that("Delete sessions - without aaw", {
    # Prepare data
    # (take a session with more people so there is a chat in it)
    otree2 <- otree_5_4_0
    session <- as.data.frame(table(otree2$all_apps_wide$session.code))
    session <- session[session$Freq >= 4L, 1L]
    part <- otree2$all_apps_wide$participant.code[
      otree2$all_apps_wide$session.code == session]
    otree2$all_apps_wide <- NULL

    # Before
    n_before_dictator <- nrow(otree2$dictator)
    n_before_survey <- nrow(otree2$survey)
    n_before_survey <- nrow(otree2$Time)
    n_before_chat <- nrow(otree2$Chats)

    # Run function
    otree2 <- delete_sessions(otree2,
                              scodes = session,
                              reason = "Only tests")

    # After
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)

    # Diff
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_survey - n_after_time
    diff_chat <- n_before_chat - n_after_chat

    # Test
    testthat::expect_gt(diff_dictator, 0L)
    testthat::expect_gt(diff_survey, 0L)
    testthat::expect_gt(diff_time, 0L)
    testthat::expect_gt(diff_chat, 0L)  # here greater 0 because all people
    # in one group/chat are deleted

    # Test if deleted people are really deleted
    test1 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$all_apps_wide$participant.code)
    test2 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$dictator$participant.code)
    test3 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$survey$participant.code)
    test4 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$Time$participant_code)
    test5 <- !any(otree2$Chats$participant_code %in%
                    otree2$info$deleted_cases$codes)

    testthat::expect_true(all(c(test1, test2)))
    testthat::expect_true(all(c(test3, test4)))
    testthat::expect_true(test5)

    # Test if participant is really deleted - version 2
    test1 <- !(part %in% otree2$all_apps_wide$participant.code)
    test2 <- !(part %in% otree2$dictator$participant.code)
    test3 <- !(part %in% otree2$start$participant.code)
    test4 <- !(part %in% otree2$survey$participant.code)
    test5 <- !(part %in% otree2$Time$participant__code)
    test6 <- !(part %in% otree2$Chats$participant__code)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5, test6)))

    # Test for consistency of the info output
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)
    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("Delete sessions - old - warning Chats", {
    # Prepare data
    otree2 <- otree_2_2_4
    session <- unique(otree2$Chats$participant__session__code)[1L]
    otree2$Chats$participant__session__code <- NULL
    part <- otree2$all_apps_wide$participant.code[
      otree2$all_apps_wide$session.code == session]

    # Before
    n_before_dictator <- nrow(otree2$dictator)
    n_before_survey <- nrow(otree2$survey)
    n_before_time <- nrow(otree2$Time)
    n_before_chat <- nrow(otree2$Chats)

    # Run function
    warning <- capture_warnings(
      otree2 <- delete_sessions(otree2,
                                scodes = session,
                                reason = "Only tests"))

    testthat::expect_true(
      any(grepl(x = warning,
                pattern = "No variable called .session")))

    # After
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)

    # Diff
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_time - n_after_time
    diff_chat <- n_before_chat - n_after_chat

    # Test
    testthat::expect_gt(diff_dictator, 0L)
    testthat::expect_gt(diff_survey, 0L)
    testthat::expect_gt(diff_time, 0L)
    testthat::expect_gt(diff_chat, 0L)  # here greater 0 because all people
    # in one group/chat are deleted

    # Test if deleted people are really deleted
    test1 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$all_apps_wide$participant.code)
    test2 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$dictator$participant.code)
    test3 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$survey$participant.code)
    test4 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$Time$participant__code)
    test5 <- !any(otree2$Chats$participant__code %in%
                     otree2$info$deleted_cases$codes)

    testthat::expect_true(all(c(test1, test2)))
    testthat::expect_true(all(c(test3, test4)))
    testthat::expect_true(test5)

    # Test if participant is really deleted - version 2
    test1 <- !(part %in% otree2$all_apps_wide$participant.code)
    test2 <- !(part %in% otree2$dictator$participant.code)
    test3 <- !(part %in% otree2$start$participant.code)
    test4 <- !(part %in% otree2$survey$participant.code)
    test5 <- !(part %in% otree2$Time$participant__code)
    test6 <- !(part %in% otree2$Chats$participant__code)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5, test6)))

    # Test for consistency of the info output
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)
    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("Delete sessions (e) - not oTree", {
    x <- c(1L, 2L, 3L)
    testthat::expect_error(delete_sessions(x,
                                           scodes = "t0rog7nz",
                                           reason = "Only tests"),
                           "not a list of oTree")
  })

  testthat::test_that("Delete sessions (e) - app Test", {
    x <- list(a = 1L, b = 2L, c = 3L)
    testthat::expect_error(delete_sessions(x,
                                           scodes = "t0rog7nz",
                                           reason = "Only tests"),
                           "not a list of oTree")
  })

  testthat::test_that("Delete sessions (e) - all messy time and chat", {
    # Prepare data
    otree2 <- otree_all
    session <- as.data.frame(table(otree2$all_apps_wide$session.code))
    session <- session[session$Freq >= 4L, 1L]

    # Run function and test
    testthat::expect_error(
      otree2 <- delete_sessions(otree2,
                                scodes = session,
                                reason = "Only tests"),
      "You combined data from old and new oTree versions")
  })

  testthat::test_that("Delete sessions (e) - all messy chat", {
    # Prepare data
    otree2 <- otree_all
    session <- as.data.frame(table(otree2$all_apps_wide$session.code))
    session <- session[session$Freq >= 4L, 1L]
    testthat::expect_warning(
      otree2 <- messy_time(otree2, combine = TRUE, info = TRUE))

    # Run function and test
    testthat::expect_error(
      otree2 <- delete_sessions(otree2,
                                scodes = session,
                                reason = "Only tests"),
      "You combined data from old and new oTree versions")
  })

  testthat::test_that("Delete sessions (e) - all messy time", {
    # Prepare data
    otree2 <- otree_all
    session <- as.data.frame(table(otree2$all_apps_wide$session.code))
    session <- session[session$Freq >= 4L, 1L]
    otree2 <- messy_chat(otree2, combine = TRUE)

    # Run function and test
    testthat::expect_error(
      otree2 <- delete_sessions(otree2,
                                scodes = session,
                                reason = "Only tests"),
      "You combined data from old and new oTree versions")
  })

  # Show dropouts  ####

  testthat::test_that("Show dropouts - new oTree, final_apps", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function
    output <- show_dropouts(otree2, final_apps = "survey")

    # Test

    # Test if all data frames and other vectors/values are there
    test1 <- "full" %in% names(output)
    test2 <- "unique" %in% names(output)
    test3 <- "all_end" %in% names(output)
    test4 <- "codes" %in% names(output)
    test5 <- "count" %in% names(output)
    testthat::expect_true(all(c(test1, test2, test3,
                                test4, test5)))

    # Test for consistency of the info output
    test1 <- setequal(output$unique$participant.code,
                      output$full$participant.code)
    test2 <- setequal(output$unique$participant.code, output$codes)
    test3 <- length(output$codes) == output$count
    test4 <- length(output$codes) == nrow(output$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("Show dropouts - new oTree,
                      final_apps, one random df", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$random_dataframe <- data.frame(
      a = c(1L, 2L, 3L),
      b = c(4L, 5L, 6L),
      c = c(7L, 8L, 9L))

    # Run function
    output <- show_dropouts(otree2, final_apps = "survey")

    # Test

    # Test if random df is not in list
    test1 <- !(any(grepl("random_dataframe", output$full$reason)))
    testthat::expect_true(test1)

    # Test if all data frames and other vectors/values are there
    test1 <- "full" %in% names(output)
    test2 <- "unique" %in% names(output)
    test3 <- "all_end" %in% names(output)
    test4 <- "codes" %in% names(output)
    test5 <- "count" %in% names(output)
    testthat::expect_true(all(c(test1, test2, test3,
                                test4, test5)))

    # Test for consistency of the info output
    test1 <- setequal(output$unique$participant.code,
                      output$full$participant.code)

    test2 <- setequal(output$unique$participant.code, output$codes)
    test3 <- length(output$codes) == output$count
    test4 <- length(output$codes) == nrow(output$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("Show dropouts - 2", {
    # Prepare data (example with inconsistent end pages)
    otree2 <- otree_5_4_0
    person <- otree2$all_apps_wide$participant.code[
      otree2$all_apps_wide$participant._current_app_name == "survey"][1L]
    otree2$all_apps_wide$participant._current_app_name[
      otree2$all_apps_wide$participant._current_app_name == "survey"][1L] <-
      "othername"

    # Before
    n_before_aaw <- nrow(otree2$all_apps_wide)
    n_before_dictator <- nrow(otree2$dictator)
    n_before_survey <- nrow(otree2$survey)
    n_before_time <- nrow(otree2$Time)
    n_before_chat <- nrow(otree2$Chats)

    # Run function
    testthat::expect_warning(
      output <- show_dropouts(otree2,
                              final_apps = "survey"),
      "At least one participant in the dropout")

    # Test
    test1 <- person %in% output$unique$participant.code
    test2 <- person %in% output$full$participant.code
    test3 <- person %in% output$codes
    testthat::expect_true(all(c(test1, test2, test3)))

    # Test for consistency of the info output
    test1 <- setequal(output$unique$participant.code,
                      output$full$participant.code)
    test2 <- setequal(output$unique$participant.code, output$codes)
    test3 <- length(output$codes) == output$count
    test4 <- length(output$codes) == nrow(output$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("Show dropouts - 2.2.4", {
    # Prepare data
    otree2 <- otree_2_2_4

    # Run function
    output <- show_dropouts(otree2, final_apps = "survey")

    # Test
    # Test if all data frames and other vectors/values are there
    test1 <- "full" %in% names(output)
    test2 <- "unique" %in% names(output)
    test3 <- "all_end" %in% names(output)
    test4 <- "codes" %in% names(output)
    test5 <- "count" %in% names(output)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5)))

    # Test for consistency of the info output
    test1 <- setequal(output$unique$participant.code,
                      output$full$participant.code)
    test2 <- setequal(output$unique$participant.code, output$codes)
    test3 <- length(output$codes) == output$count
    test4 <- length(output$codes) == nrow(output$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("Show dropouts - pagenames", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function
    output <- show_dropouts(otree2, final_pages = "Demographics")

    # Test
    # Test if all data frames and other vectors/values are there
    test1 <- "full" %in% names(output)
    test2 <- "unique" %in% names(output)
    test3 <- "all_end" %in% names(output)
    test4 <- "codes" %in% names(output)
    test5 <- "count" %in% names(output)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5)))

    # Test for consistency of the info output
    test1 <- setequal(output$unique$participant.code,
                      output$full$participant.code)
    test2 <- setequal(output$unique$participant.code, output$codes)
    test3 <- length(output$codes) == output$count
    test4 <- length(output$codes) == nrow(output$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("Show dropouts - final_apps and pagenames", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function
    output <- show_dropouts(otree2,
                            final_apps = "survey",
                            final_pages = "Demographics")

    # Test
    # Test if all data frames and other vectors/values are there
    test1 <- "full" %in% names(output)
    test2 <- "unique" %in% names(output)
    test3 <- "all_end" %in% names(output)
    test4 <- "codes" %in% names(output)
    test5 <- "count" %in% names(output)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5)))

    # Test for consistency of the info output
    test1 <- setequal(output$unique$participant.code,
                      output$full$participant.code)

    test2 <- setequal(output$unique$participant.code, output$codes)
    test3 <- length(output$codes) == output$count
    test4 <- length(output$codes) == nrow(output$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("Show dropouts - saved vars", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function
    output <-
      show_dropouts(otree2, "survey",
                    saved_vars = "dictator.1.group.id_in_subsession")

    # Test
    # Test if all data frames and other vectors/values are there
    test1 <- "full" %in% names(output)
    test2 <- "unique" %in% names(output)
    test3 <- "all_end" %in% names(output)
    test4 <- "codes" %in% names(output)
    test5 <- "count" %in% names(output)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5)))

    # Test for consistency of the info output
    test1 <- setequal(output$unique$participant.code,
                      output$full$participant.code)

    test2 <- setequal(output$unique$participant.code, output$codes)
    test3 <- length(output$codes) == output$count
    test4 <- length(output$codes) == nrow(output$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))

    # Test if saved variable is there
    test1 <- "dictator.1.group.id_in_subsession" %in% names(output$unique)
    test2 <- "dictator.1.group.id_in_subsession" %in% names(output$full)
    testthat::expect_true(all(c(test1, test2)))
  })

  testthat::test_that("Show dropouts - saved vars not there", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(show_dropouts(otree2, "survey",
                                         saved_vars = "invalidvar"),
                           "saved_vars not in all_apps_wide")
  })

  testthat::test_that("Show dropouts (e) - specify", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    expect_error(show_dropouts(otree2),
                 "Please specify final_apps or final_pages or both")
  })

  testthat::test_that("Show dropouts (w) - saved vars", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$all_apps_wide <- NULL

    # Run function and test
    testthat::expect_warning(
      output <-
        show_dropouts(otree2,
                      final_apps = "survey",
                      saved_vars = "dictator.1.group.id_in_subsession"),
      "is ignored.")

    # Test
    # Test if all data frames and other vectors/values are there
    test1 <- "full" %in% names(output)
    test2 <- "unique" %in% names(output)
    # all_end is only shown if AAW exist:
    test3 <- !("all_end" %in% names(output))
    test4 <- "codes" %in% names(output)
    test5 <- "count" %in% names(output)
    testthat::expect_true(all(c(test1, test2, test3,
                                test4, test5)))

    # Test for consistency of the info output
    test1 <- setequal(output$unique$participant.code,
                      output$full$participant.code)

    test2 <- setequal(output$unique$participant.code, output$codes)
    test3 <- length(output$codes) == output$count
    test4 <- length(output$codes) == nrow(output$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  print("---- delete_dropouts -----")

  # Delete dropouts  ####
  testthat::test_that("Delete dropouts - final_apps new oTree, custom exp", {
    # Prepare data
    otree1 <- otree_5_4_0

    # Before
    n_before_aaw <- nrow(otree1$all_apps_wide)
    n_before_dictator <- nrow(otree1$dictator)
    n_before_survey <- nrow(otree1$survey)
    n_before_survey <- nrow(otree1$Time)
    n_before_chat <- nrow(otree1$Chats)

    # Run function
    otree2 <- delete_dropouts(otree1,
                              final_apps = "survey")

    # After
    n_after_aaw <- nrow(otree2$all_apps_wide)
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)

    # Diff
    diff_aaw <- n_before_aaw - n_after_aaw
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_survey - n_after_time
    diff_chat <- n_before_chat - n_after_chat

    # Test difference
    testthat::expect_gt(diff_aaw, 0L)
    testthat::expect_gt(diff_dictator, 0L)
    testthat::expect_gt(diff_survey, 0L)
    testthat::expect_gt(diff_time, 0L)
    testthat::expect_identical(diff_chat, 0L) # Equal zero!!!

    # Test if not all cases were deleted!
    testthat::expect_gt(n_after_aaw, 0L)
    testthat::expect_gt(n_after_dictator, 0L)
    testthat::expect_gt(n_after_survey, 0L)
    testthat::expect_gt(n_after_time, 0L)
    testthat::expect_gt(n_after_chat, 0L)

    #  if deleted people are really deleted
    test1 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$all_apps_wide$participant.code)
    test2 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$dictator$participant.code)
    test3 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$survey$participant.code)
    test4 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$Time$participant_code)

    testthat::expect_true(all(c(test1, test2)))
    testthat::expect_true(all(c(test3, test4)))

    # Chats differently
    test5a <- (otree2$info$deleted_cases$codes %in%
                 otree1$Chats$participant_code)  # Before
    test5b <- (otree2$info$deleted_cases$codes %in%
                 otree2$Chats$participant_code) # After

    testthat::expect_identical(test5a, test5b)

    # Test for consistency of the info output
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)
    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))

    # Test if nothing is deleted from custom export
    testthat::expect_true("custexp_dictator" %in% names(otree2))
    testthat::expect_true(nrow(otree2$custexp_dictator) == 8L)
  })

  testthat::test_that("Delete dropouts - final_apps new oTree, random df", {
    # Prepare data
    otree1 <- otree_5_4_0
    otree1$random_dataframe <- data.frame(
      a = c(1L, 2L, 3L),
      b = c(4L, 5L, 6L),
      c = c(7L, 8L, 9L))

    # Before
    n_before_aaw <- nrow(otree1$all_apps_wide)
    n_before_dictator <- nrow(otree1$dictator)
    n_before_survey <- nrow(otree1$survey)
    n_before_survey <- nrow(otree1$Time)
    n_before_chat <- nrow(otree1$Chats)
    before_random <- nrow(otree1$random_dataframe)

    # Run function
    otree2 <- delete_dropouts(otree1,
                              final_apps = "survey")

    # After
    n_after_aaw <- nrow(otree2$all_apps_wide)
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)
    n_after_random <- nrow(otree2$random_dataframe)

    # Diff
    diff_aaw <- n_before_aaw - n_after_aaw
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_survey - n_after_time
    diff_chat <- n_before_chat - n_after_chat
    diff_random <- before_random - n_after_random

    # Test difference
    testthat::expect_gt(diff_aaw, 0L)
    testthat::expect_gt(diff_dictator, 0L)
    testthat::expect_gt(diff_survey, 0L)
    testthat::expect_gt(diff_time, 0L)
    testthat::expect_identical(diff_chat, 0L) # Equal zero!!!
    testthat::expect_identical(diff_random, 0L)

    # Test if not all cases were deleted!
    testthat::expect_gt(n_after_aaw, 0L)
    testthat::expect_gt(n_after_dictator, 0L)
    testthat::expect_gt(n_after_survey, 0L)
    testthat::expect_gt(n_after_time, 0L)
    testthat::expect_gt(n_after_chat, 0L)
    testthat::expect_gt(n_after_random, 0L)

    # Test if random df is not in list
    test1 <- !(any(grepl("random_dataframe",
                         otree2$info$deleted_cases$full$reason)))
    testthat::expect_true(test1)

    # Test if deleted people are really deleted
    test1 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$all_apps_wide$participant.code)
    test2 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$dictator$participant.code)
    test3 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$survey$participant.code)
    test4 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$Time$participant_code)

    testthat::expect_true(all(c(test1, test2)))
    testthat::expect_true(all(c(test3, test4)))

    # Chats differently
    test5a <- (otree2$info$deleted_cases$codes %in%
                 otree1$Chats$participant_code)  # Before
    test5b <- (otree2$info$deleted_cases$codes %in%
                 otree2$Chats$participant_code) # After

    testthat::expect_identical(test5a, test5b)

    # Test for consistency of the info output
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)
    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))

    # Test if nothing is deleted from custom export
    testthat::expect_true("custexp_dictator" %in% names(otree2))
    testthat::expect_true(nrow(otree2$custexp_dictator) == 8L)
  })

  testthat::test_that("Delete dropouts - final_apps old oTree", {
    # Prepare data
    otree1 <- otree_2_2_4

    # Before
    n_before_aaw <- nrow(otree1$all_apps_wide)
    n_before_dictator <- nrow(otree1$dictator)
    n_before_survey <- nrow(otree1$survey)
    n_before_survey <- nrow(otree1$Time)
    n_before_chat <- nrow(otree1$Chats)

    # Run function
    otree2 <- delete_dropouts(otree1,
                              final_apps = "survey")

    # After
    n_after_aaw <- nrow(otree2$all_apps_wide)
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)

    # Diff
    diff_aaw <- n_before_aaw - n_after_aaw
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_survey - n_after_time
    diff_chat <- n_before_chat - n_after_chat

    # Test difference
    testthat::expect_gt(diff_aaw, 0L)
    testthat::expect_gt(diff_dictator, 0L)
    testthat::expect_gt(diff_survey, 0L)
    testthat::expect_gt(diff_time, 0L)
    testthat::expect_identical(diff_chat, 0L) # Equal zero!!!

    # Test if not all cases were deleted!
    testthat::expect_gt(n_after_aaw, 0L)
    testthat::expect_gt(n_after_dictator, 0L)
    testthat::expect_gt(n_after_survey, 0L)
    testthat::expect_gt(n_after_time, 0L)
    testthat::expect_gt(n_after_chat, 0L)

    # Test if deleted people are really deleted
    test1 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$all_apps_wide$participant.code)
    test2 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$dictator$participant.code)
    test3 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$survey$participant.code)
    test4 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$Time$participant_code)

    testthat::expect_true(all(c(test1, test2)))
    testthat::expect_true(all(c(test3, test4)))

    # Chats differently
    test5a <- (otree2$info$deleted_cases$codes %in%
                 otree1$Chats$participant_code)  # Before
    test5b <- (otree2$info$deleted_cases$codes %in%
                 otree2$Chats$participant_code) # After

    testthat::expect_identical(test5a, test5b)

    # Test for consistency of the info output
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)

    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("Delete dropouts - different otree versions", {
    # Prepare data
    otree1 <- otree_all

    # Before
    n_before_aaw <- nrow(otree1$all_apps_wide)
    n_before_dictator <- nrow(otree1$dictator)
    n_before_survey <- nrow(otree1$survey)
    n_before_survey <- nrow(otree1$Time)
    n_before_chat <- nrow(otree1$Chats)

    # Run function
    otree2 <- delete_dropouts(otree1,
                              final_apps = "survey")
    # After
    n_after_aaw <- nrow(otree2$all_apps_wide)
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)

    # Diff
    diff_aaw <- n_before_aaw - n_after_aaw
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_survey - n_after_time
    diff_chat <- n_before_chat - n_after_chat

    # Test difference
    testthat::expect_gt(diff_aaw, 0L)
    testthat::expect_gt(diff_dictator, 0L)
    testthat::expect_gt(diff_survey, 0L)
    testthat::expect_gt(diff_time, 0L)
    testthat::expect_identical(diff_chat, 0L) # Equal zero!!!

    # Test if not all cases were deleted!
    testthat::expect_gt(n_after_aaw, 0L)
    testthat::expect_gt(n_after_dictator, 0L)
    testthat::expect_gt(n_after_survey, 0L)
    testthat::expect_gt(n_after_time, 0L)
    testthat::expect_gt(n_after_chat, 0L)

    # Test if deleted people are really deleted
    test1 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$all_apps_wide$participant.code)
    test2 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$dictator$participant.code)
    test3 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$survey$participant.code)

    testthat::expect_true(all(c(test1, test2)))
    testthat::expect_true(all(c(test3)))

    # Time differently
    test1 <- !any(otree2$info[["deleted_cases"]][["codes"]] %in%
                    unique(otree2$Time$participant_code))
    test2 <- !any(otree2$info[["deleted_cases"]][["codes"]] %in%
                    unique(otree2$Time$participant__code))
    testthat::expect_true(test1)
    testthat::expect_true(test2)

    # Chats differently
    test5a <- otree2$info$deleted_cases$codes %in%
      otree1$Chats$participant_code  # Before
    test5b <- otree2$info$deleted_cases$codes %in%
      otree2$Chats$participant_code # After
    testthat::expect_identical(test5a, test5b)

    # Test for consistency of the info output
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)
    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("Delete dropouts - final_apps & pagenames", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Before
    n_before_aaw <- nrow(otree2$all_apps_wide)
    n_before_dictator <- nrow(otree2$dictator)
    n_before_survey <- nrow(otree2$survey)
    n_before_survey <- nrow(otree2$Time)
    n_before_chat <- nrow(otree2$Chats)

    # Run function
    otree2 <- delete_dropouts(otree2,
                              final_apps = "survey",
                              final_pages = "Demographics")

    # After
    n_after_aaw <- nrow(otree2$all_apps_wide)
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)

    # Diff
    diff_aaw <- n_before_aaw - n_after_aaw
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_survey - n_after_time
    diff_chat <- n_before_chat - n_after_chat

    # Test difference
    testthat::expect_gt(diff_aaw, 0L)
    testthat::expect_gt(diff_dictator, 0L)
    testthat::expect_gt(diff_survey, 0L)
    testthat::expect_gt(diff_time, 0L)
    testthat::expect_identical(diff_chat, 0L)

    # Test if not all cases were deleted!
    testthat::expect_gt(n_after_aaw, 0L)
    testthat::expect_gt(n_after_dictator, 0L)
    testthat::expect_gt(n_after_survey, 0L)
    testthat::expect_gt(n_after_time, 0L)
    testthat::expect_gt(n_after_chat, 0L)

    # Test if deleted people are really deleted (sample)
    test1 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$all_apps_wide$participant.code)
    test2 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$dictator$participant.code)
    test3 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$survey$participant.code)
    test4 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$Time$participant_code)

    testthat::expect_true(all(c(test1, test2)))
    testthat::expect_true(all(c(test3, test4)))

    # Chats differently
    test5a <- otree2$info$deleted_cases$codes %in%
      otree2$Chats$participant_code  # Before
    test5b <- otree2$info$deleted_cases$codes %in%
      otree2$Chats$participant_code  # After

    testthat::expect_identical(test5a, test5b)

    # Test for consistency of the info output
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)
    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("Delete dropouts - only pagenames", {
    # Prepare data
    otree1 <- otree_5_4_0

    # Before
    n_before_aaw <- nrow(otree1$all_apps_wide)
    n_before_dictator <- nrow(otree1$dictator)
    n_before_survey <- nrow(otree1$survey)
    n_before_survey <- nrow(otree1$Time)
    n_before_chat <- nrow(otree1$Chats)

    # Run function
    otree2 <- delete_dropouts(otree1,
                              final_pages = "Demographics")

    # After
    n_after_aaw <- nrow(otree2$all_apps_wide)
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)

    # Diff
    diff_aaw <- n_before_aaw - n_after_aaw
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_survey - n_after_time
    diff_chat <- n_before_chat - n_after_chat

    # Test difference
    testthat::expect_gt(diff_aaw, 0L)
    testthat::expect_gt(diff_dictator, 0L)
    testthat::expect_gt(diff_survey, 0L)
    testthat::expect_gt(diff_time, 0L)
    testthat::expect_identical(diff_chat, 0L)

    # Test if not all cases were deleted!
    testthat::expect_gt(n_after_aaw, 0L)
    testthat::expect_gt(n_after_dictator, 0L)
    testthat::expect_gt(n_after_survey, 0L)
    testthat::expect_gt(n_after_time, 0L)
    testthat::expect_gt(n_after_chat, 0L)

    # Test if deleted people are really deleted
    test1 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$all_apps_wide$participant.code)
    test2 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$dictator$participant.code)
    test3 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$survey$participant.code)
    test4 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$Time$participant_code)

    testthat::expect_true(all(c(test1, test2)))
    testthat::expect_true(all(c(test3, test4)))
    # Chats differently
    test5a <- otree2$info$deleted_cases$codes %in%
      otree1$Chats$participant_code  # Before
    test5b <- otree2$info$deleted_cases$codes %in%
      otree2$Chats$participant_code # After

    testthat::expect_identical(test5a, test5b)

    # Test for consistency of the info output
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)
    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("Delete dropouts 2 - inconsistent yes", {
    # Prepare data (example with inconsistent end pages)
    otree1 <- otree_5_4_0

    person <- otree1$all_apps_wide$participant.code[
      otree1$all_apps_wide$participant._current_app_name == "survey"][1L]

    otree1$all_apps_wide$participant._current_app_name[
      otree1$all_apps_wide$participant._current_app_name == "survey"][1L] <-
      "othername"

    # Before
    n_before_aaw <- nrow(otree1$all_apps_wide)
    n_before_dictator <- nrow(otree1$dictator)
    before_start <- nrow(otree1$start)
    n_before_survey <- nrow(otree1$survey)
    n_before_survey <- nrow(otree1$Time)
    n_before_chat <- nrow(otree1$Chats)

    # Run function
    otree2 <- delete_dropouts(otree1,
                              final_apps = "survey",
                              inconsistent = "yes")

    # After
    n_after_aaw <- nrow(otree2$all_apps_wide)
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)

    # Diff
    diff_aaw <- n_before_aaw - n_after_aaw
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_survey - n_after_time
    diff_chat <- n_before_chat - n_after_chat

    # Test difference
    testthat::expect_gt(diff_dictator, 0L)
    testthat::expect_gt(diff_aaw, 0L)
    testthat::expect_gt(diff_time, 0L)
    testthat::expect_gt(diff_survey, 0L)
    testthat::expect_identical(diff_chat, 0L)

    # Test if not all cases were deleted!
    testthat::expect_gt(n_after_aaw, 0L)
    testthat::expect_gt(n_after_dictator, 0L)
    testthat::expect_gt(n_after_survey, 0L)
    testthat::expect_gt(n_after_time, 0L)
    testthat::expect_gt(n_after_chat, 0L)

    # Test if deleted people are really deleted
    test1 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$all_apps_wide$participant.code)
    test2 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$dictator$participant.code)
    test3 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$survey$participant.code)
    test4 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$Time$participant_code)
    test5a <- otree1$Chats$participant_code %in%
      otree2$info$deleted_cases$codes  # Chats differently: Before
    test5b <- otree2$Chats$participant_code %in%
      otree2$info$deleted_cases$codes # Chats differently: After

    testthat::expect_true(all(c(test1, test2)))
    testthat::expect_true(all(c(test3, test4)))
    testthat::expect_identical(test5a, test5b)

    # Test - check if person gets deleted anyways (version 2)
    test3 <- person %in% otree2$info[["deleted_cases"]][["codes"]]
    test4 <- !(person %in% otree2$all_apps_wide$participant.code)
    test5 <- !(person %in% otree2$dictator$participant.code)
    test6 <- !(person %in% otree2$Time$participant.code)
    test7 <- !(person %in% otree2$start$participant.code)
    test8 <- !(person %in% otree2$survey$participant.code)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5, test6,
                                test7, test8)))

    # Test for consistency of the info output
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)
    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))

    # Test if nothing is deleted from custom export
    testthat::expect_true("custexp_dictator" %in% names(otree2))
    testthat::expect_true(nrow(otree2$custexp_dictator) == 8L)
  })

  testthat::test_that("Delete dropouts 2 - inconsistent no", {
    # Prepare data (example with inconsistent end pages)
    otree2 <- otree_5_4_0
    otree2$all_apps_wide$participant._current_app_name[
      otree2$all_apps_wide$participant._current_app_name == "survey"][1L] <-
      "othername"
    before <- nrow(otree2$all_apps_wide)

    # Run function and test
    testthat::expect_error(delete_dropouts(otree2,
                                           final_apps = "survey",
                                           inconsistent = "no"),
                           "The user requested termination")
  })

  testthat::test_that("Delete dropouts 2 - inconsistent check", {
    # Prepare data (example with inconsistent end pages)
    otree1 <- otree_5_4_0

    otree1$all_apps_wide$participant._current_app_name[
      otree1$all_apps_wide$participant._current_app_name == "survey"][1L] <-
      "othername"

    # Before
    n_before_aaw <- nrow(otree1$all_apps_wide)
    n_before_dictator <- nrow(otree1$dictator)
    n_before_survey <- nrow(otree1$survey)
    n_before_survey <- nrow(otree1$Time)
    n_before_chat <- nrow(otree1$Chats)

    # Run function and capture user-interaction
    ans <- "yes"
    my_file <- textConnection(ans)

    withr::with_options(
      list(mypkg.connection = my_file),
      {
        output <- capture.output(
          otree2 <- delete_dropouts(otree1,
                                    final_apps = "survey"))

        # Test if the output from the cat() function is shown
        cat_output_displayed <-
          any(grepl("At least one participant in the dropout list",
                    output))

        testthat::expect_true(cat_output_displayed)
    })

    close(my_file)

    # Test
    # After
    n_after_aaw <- nrow(otree2$all_apps_wide)
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)

    # Diff
    diff_aaw <- n_before_aaw - n_after_aaw
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_survey - n_after_time
    diff_chat <- n_before_chat - n_after_chat

    # Test difference
    testthat::expect_gt(diff_aaw, 0L)
    testthat::expect_gt(diff_dictator, 0L)
    testthat::expect_gt(diff_survey, 0L)
    testthat::expect_gt(diff_time, 0L)
    testthat::expect_identical(diff_chat, 0L) # Equal zero!!!

    # Test if not all cases were deleted!
    testthat::expect_gt(n_after_aaw, 0L)
    testthat::expect_gt(n_after_dictator, 0L)
    testthat::expect_gt(n_after_survey, 0L)
    testthat::expect_gt(n_after_time, 0L)
    testthat::expect_gt(n_after_chat, 0L)

    # Test if deleted people are really deleted
    test1 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$all_apps_wide$participant.code)
    test2 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$dictator$participant.code)
    test3 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$survey$participant.code)
    test4 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$Time$participant_code)
    test5a <- otree1$Chats$participant_code %in%
      otree2$info$deleted_cases$codes  # Chats differently: Before
    test5b <- otree2$Chats$participant_code %in%
      otree2$info$deleted_cases$codes # Chats differently: After

    testthat::expect_true(all(c(test1, test2)))
    testthat::expect_true(all(c(test3, test4)))
    testthat::expect_identical(test5a, test5b)

    # Test for consistency of the info output
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)
    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("Delete dropouts (e) - specify final_apps or pages", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    expect_error(delete_dropouts(otree2),
                 "Please specify final_apps or final_pages")
  })

  testthat::test_that("Delete dropouts (e) - saved vars no aaw", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$all_apps_wide <- NULL

    # Run function and test
    testthat::expect_error(
      delete_dropouts(otree2,
                      final_apps = "survey",
                      saved_vars = "dictator.1.group.id_in_subsession"),
      "The argument \"saved_vars\" only works when")
  })

  testthat::test_that("Delete dropouts (e) - saved vars 2 ", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(delete_dropouts(otree2,
                                           final_apps = "survey",
                                           saved_vars = "notthere"),
                           "not in all_apps_wide")
  })

  testthat::test_that("Delete dropouts (e) - no all apps wide", {
    # Prepare data
    otree1 <- otree_5_4_0
    otree1$all_apps_wide <- NULL

    # Before
    n_before_dictator <- nrow(otree1$dictator)
    n_before_survey <- nrow(otree1$survey)
    n_before_survey <- nrow(otree1$Time)
    n_before_chat <- nrow(otree1$Chats)

    # Run function
    testthat::expect_warning(
      otree2 <- delete_dropouts(otree1,
                                final_pages = "Demographics"), "No")

    # Test
    # After
    n_after_dictator <- nrow(otree2$dictator)
    n_after_survey <- nrow(otree2$survey)
    n_after_time <- nrow(otree2$Time)
    n_after_chat <- nrow(otree2$Chats)

    # Diff
    diff_dictator <- n_before_dictator - n_after_dictator
    diff_survey <- n_before_survey - n_after_survey
    diff_time <- n_before_survey - n_after_time
    diff_chat <- n_before_chat - n_after_chat

    # Test difference
    testthat::expect_gt(diff_dictator, 0L)
    testthat::expect_gt(diff_survey, 0L)
    testthat::expect_gt(diff_time, 0L)
    testthat::expect_identical(diff_chat, 0L) # Equal zero!!!

    # Test if not all cases were deleted!
    testthat::expect_gt(n_after_dictator, 0L)
    testthat::expect_gt(n_after_survey, 0L)
    testthat::expect_gt(n_after_time, 0L)
    testthat::expect_gt(n_after_chat, 0L)

    # Test if deleted people are really deleted
    test1 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$all_apps_wide$participant.code)
    test2 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$dictator$participant.code)
    test3 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$survey$participant.code)
    test4 <-
      !(otree2$info$deleted_cases$codes %in%
          otree2$Time$participant_code)

    testthat::expect_true(all(c(test1, test2)))
    testthat::expect_true(all(c(test3, test4)))
    # Chats differently
    test5a <- otree2$info$deleted_cases$codes %in%
      otree1$Chats$participant_code  # Before
    test5b <- otree2$info$deleted_cases$codes %in%
      otree2$Chats$participant_code # After

    testthat::expect_identical(test5a, test5b)
  })

  print("---- delete_sessions -----")

  # Combined deletion test  ####
  testthat::test_that("several deletions  - version 1", {
    otree2 <- otree_5_4_0

    # Delete cases
    person <- otree2$all_apps_wide$participant.code[c(1L, 2L, 3L, 4L)]
    otree2 <- delete_cases(otree2, person,
                           reason = "Upon request")

    # Delete dropouts
    otree2 <- delete_dropouts(otree2,
                              final_apps = "survey")

    # Session delete
    session <- as.data.frame(table(otree2$all_apps_wide$session.code))
    session <- session[session$Freq >= 2L, 1L]
    otree2 <- delete_sessions(otree2,
                              scodes = session,
                              reason = "Only tests")

    # Test
    test0 <- !("" %in% otree2$info$deleted_cases$unique$reason)
    test1 <- "ENC" %in% otree2$info$deleted_cases$unique$reason
    test2 <- "Only tests" %in% otree2$info$deleted_cases$unique$reason
    test3 <- "Upon request" %in% otree2$info$deleted_cases$unique$reason
    testthat::expect_true(all(c(test0, test1, test2, test3)))

    # Test for consistency of the info output
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)

    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))

    # Test if nothing is deleted from custom export
    testthat::expect_true("custexp_dictator" %in% names(otree2))
    testthat::expect_true(nrow(otree2$custexp_dictator) == 8L)
  })

  testthat::test_that("several deletions - version 2", {
    # Prepare data
    otree2 <- otree_5_4_0
    unique(otree2$all_apps_wide$participant.code)

    # Delete dropouts
    otree2 <- delete_dropouts(otree2,
                              final_apps = "survey")

    # Delete cases
    person <- otree2$all_apps_wide$participant.code[1L]
    otree2 <- delete_cases(otree2, person,
                           reason = "Upon request")

    # Session delete
    otree2$all_apps_wide$session.code[1L]
    otree2 <-
      delete_sessions(otree2,
                      scodes = otree2$all_apps_wide$session.code[1L],
                      reason = "Only tests")

    # Test
    test0 <- !("" %in% otree2$info$deleted_cases$unique$reason)
    test1 <- "ENC" %in% otree2$info$deleted_cases$unique$reason
    test2 <- "Only tests" %in% otree2$info$deleted_cases$unique$reason
    test3 <- "Upon request" %in% otree2$info$deleted_cases$unique$reason
    testthat::expect_true(all(c(test0, test1, test2, test3)))

    # Test for consistency of the info output
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)
    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))

    # Test if nothing is deleted from custom export
    testthat::expect_true("custexp_dictator" %in% names(otree2))
    testthat::expect_true(nrow(otree2$custexp_dictator) == 8L)
  })

  testthat::test_that("several deletions - version 3", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Session delete
    otree2 <-
      delete_sessions(otree2,
                      scodes = otree2$all_apps_wide$session.code[1L],
                      reason = "Only tests")

    # Delete dropouts
    otree2 <- delete_dropouts(otree2,
                              final_apps = "survey")

    # Delete cases
    person <- otree2$all_apps_wide$participant.code[c(1L, 2L)]
    otree2 <- delete_cases(otree2, person,
                           reason = "Upon request")
    # Test
    test0 <- !("" %in% otree2$info$deleted_cases$unique$reason)
    test1 <- "ENC" %in% otree2$info$deleted_cases$unique$reason
    test2 <- "Only tests" %in% otree2$info$deleted_cases$unique$reason
    test3 <- "Upon request" %in% otree2$info$deleted_cases$unique$reason
    testthat::expect_true(all(c(test0, test1, test2, test3)))

    # Test for consistency of the info output
    test1 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$full$participant.code)

    test2 <- setequal(otree2$info$deleted_cases$unique$participant.code,
                      otree2$info$deleted_cases$codes)
    test3 <- length(otree2$info$deleted_cases$codes) ==
      otree2$info$deleted_cases$count
    test4 <- length(otree2$info$deleted_cases$codes) ==
      nrow(otree2$info$deleted_cases$unique)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  # Make IDs  ####
  testthat::test_that("Make IDs - from_var, gmake = TRUE", {
    # Prepare data
    otree2 <- otree_5_4_0
    order_aaw_before <- otree2$all_apps_wide$participant.code
    order_dictator_before <- otree2$dictator$participant.code

    # Run function
    otree2 <- make_ids(otree2,
                       pmake = TRUE,
                       gmake = TRUE,
                       from_var = "dictator.1.group.id_in_subsession",
                       emptyrows = "yes") # ignore empty rows stop
    # Test
    # Test if order of DF entries did not change
    order_aaw_after <- otree2$all_apps_wide$participant.code
    order_dictator_after <- otree2$dictator$participant.code

    test1 <- all(order_aaw_before == order_aaw_after)
    test2 <- all(order_dictator_before == order_dictator_after)
    testthat::expect_true(all(c(test1, test2)))

    # Test if variables are there and not NA
    test1 <- !is.null(otree2$dictator$group_id)
    test2 <- !(anyNA(otree2$dictator$group_id))
    test3 <- !is.null(otree2$dictator$session_id)
    test4 <- !(anyNA(otree2$dictator$session_id))
    testthat::expect_true(all(c(test1, test2, test3, test4)))

    # Test if all IDs are there
    test1 <-
      all(seq_along(unique(otree2$all_apps_wide$participant.code)) %in%
            otree2$all_apps_wide$participant_id)

    test2 <- all(seq_along(unique(otree2$all_apps_wide$session.code)) %in%
                   otree2$all_apps_wide$session_id)

    test3 <- all(
      1L:(length(otree2$dictator$group_id) / 3L / 2L) %in%
        otree2$dictator$group_id)

    testthat::expect_true(all(c(test1, test2, test3)))

    # Test for increasing IDs
    # Test if group_ids are increasing with session_id
    otree2$dictator <- otree2$dictator[order(otree2$dictator$session_id,
                                             otree2$dictator$group_id), ]
    test1 <- all(diff(otree2$dictator$group_id) >= 0L)

    # Test if participant_ids are increasing with group_ids
    otree2$dictator <-
      otree2$dictator[order(otree2$dictator$group_id,
                            otree2$dictator$participant_id), ]
    test2 <- all(diff(otree2$dictator$participant_id) >= 0L)
    testthat::expect_true(all(c(test1, test2)))

    testthat::expect_true(all(names(otree2$custexp_dictator) ==
                            c("test", "testplayer")))
  })

  testthat::test_that("Make IDs (w) - from_var, gmake = TRUE", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$random_dataframe <- data.frame(
      a = c(1L, 2L, 3L),
      b = c(4L, 5L, 6L),
      c = c(7L, 8L, 9L))
    order_aaw_before <- otree2$all_apps_wide$participant.code
    order_dictator_before <- otree2$dictator$participant.code

    # Run function
    testthat::expect_warning(
      otree2 <- make_ids(otree2,
                         pmake = TRUE,
                         gmake = TRUE,
                         from_var = "dictator.1.group.id_in_subsession",
                         emptyrows = "yes"), # ignore empty rows stop
      "Participant code variable couldn't be found in")

    # Test
    # Test if order of DF entries did not change
    order_aaw_after <- otree2$all_apps_wide$participant.code
    order_dictator_after <- otree2$dictator$participant.code

    test1 <- all(order_aaw_before == order_aaw_after)
    test2 <- all(order_dictator_before == order_dictator_after)
    testthat::expect_true(all(c(test1, test2)))

    # Test if variables are there and not NA
    test1 <- !is.null(otree2$dictator$group_id)
    test2 <- !anyNA(otree2$dictator$group_id)
    test3 <- !is.null(otree2$dictator$session_id)
    test4 <- !anyNA(otree2$dictator$session_id)
    testthat::expect_true(all(c(test1, test2, test3, test4)))

    # Test if all IDs are there
    test1 <- all(
      seq_along(unique(otree2$all_apps_wide$participant.code)) %in%
        otree2$all_apps_wide$participant_id)
    test2 <- all(seq_along(unique(otree2$all_apps_wide$session.code)) %in%
                   otree2$all_apps_wide$session_id)
    test3 <- all(
      1L:(length(otree2$dictator$group_id) / 3L / 2L) %in%
        otree2$dictator$group_id)

    testthat::expect_true(all(c(test1, test2, test3)))

    # Test for increasing IDs
    # Test if group_ids are increasing with session_id
    otree2$dictator <- otree2$dictator[order(otree2$dictator$session_id,
                                             otree2$dictator$group_id), ]
    test1 <- all(diff(otree2$dictator$group_id) >= 0L)

    # Test if participant_ids are increasing with group_ids
    otree2$dictator <-
      otree2$dictator[order(otree2$dictator$group_id,
                            otree2$dictator$participant_id), ]
    test2 <- all(diff(otree2$dictator$participant_id) >= 0L)
    testthat::expect_true(all(c(test1, test2)))
  })

  testthat::test_that("Make IDs (w) - two sessions na", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$all_apps_wide$session.code[c(1L, 2L, 3L)] <- NA
    order_aaw_before <- otree2$all_apps_wide$participant.code
    order_dictator_before <- otree2$dictator$participant.code

    # Run function
    testthat::expect_warning(
      otree2 <- make_ids(otree2,
                         pmake = TRUE,
                         gmake = TRUE,
                         from_var = "dictator.1.group.id_in_subsession",
                         emptyrows = "yes"),
      "At least one of your session.codes in your from_app is NA")

    # Test
    # Test if order of DF entries did not change
    order_aaw_after <- otree2$all_apps_wide$participant.code
    order_dictator_after <- otree2$dictator$participant.code

    test1 <- all(order_aaw_before == order_aaw_after)
    test2 <- all(order_dictator_before == order_dictator_after)
    testthat::expect_true(all(c(test1, test2)))

    # Test if variables are there and not NA
    test1 <- !is.null(otree2$dictator$group_id)
    test2 <- !anyNA(otree2$dictator$group_id)
    test3 <- !is.null(otree2$dictator$session_id)
    test4 <- !anyNA(otree2$dictator$session_id)
    testthat::expect_true(all(c(test1, test2, test3, test4)))

    # Test if all IDs are there
    test1 <-
      all(seq_along(unique(otree2$all_apps_wide$participant.code)) %in%
            otree2$all_apps_wide$participant_id)

    test2 <- all(seq_along(unique(otree2$all_apps_wide$session.code)) %in%
                   otree2$all_apps_wide$session_id)

    test3 <- all(
      1L:(length(otree2$dictator$group_id) / 3L / 2L) %in%
        otree2$dictator$group_id)

    testthat::expect_true(all(c(test1, test2, test3)))

    # Test for increasing IDs
    # Test if group_ids are increasing with session_id
    otree2$dictator <- otree2$dictator[order(otree2$dictator$session_id,
                                             otree2$dictator$group_id), ]
    test1 <- all(diff(otree2$dictator$group_id) >= 0L)

    # Test if participant_ids are increasing with group_ids
    otree2$dictator <-
      otree2$dictator[order(otree2$dictator$group_id,
                            otree2$dictator$participant_id), ]

    test2 <- all(diff(otree2$dictator$participant_id) >= 0L)

    testthat::expect_true(all(c(test1, test2)))
  })

  testthat::test_that("Make IDs - from_var", {
    # Prepare data
    otree2 <- otree_5_4_0
    order_aaw_before <- otree2$all_apps_wide$participant.code
    order_dictator_before <- otree2$dictator$participant.code

    # Run function
    otree2 <- make_ids(otree2,
                       gmake = TRUE,
                       pmake = TRUE,
                       from_var = "dictator.1.group.id_in_subsession")

    # Test if order of DF entries did not change
    order_aaw_after <- otree2$all_apps_wide$participant.code
    order_dictator_after <- otree2$dictator$participant.code

    test1 <- all(order_aaw_before == order_aaw_after)
    test2 <- all(order_dictator_before == order_dictator_after)
    testthat::expect_true(all(c(test1, test2)))

    # Test if variables are there and not NA
    test1 <- !is.null(otree2$dictator$group_id)
    test2 <- !anyNA(otree2$dictator$group_id)
    test3 <- !is.null(otree2$dictator$session_id)
    test4 <- !anyNA(otree2$dictator$session_id)
    test5 <- !is.null(otree2$dictator$participant_id)
    test6 <- !anyNA(otree2$dictator$participant_id)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5, test6)))

    # Test if all IDs are there
    test1 <-
      all(seq_along(unique(otree2$all_apps_wide$participant.code)) %in%
            otree2$all_apps_wide$participant_id)

    test2 <- all(seq_along(unique(otree2$all_apps_wide$session.code)) %in%
                   otree2$all_apps_wide$session_id)

    test3 <- all(
      1L:(length(otree2$dictator$group_id) / 3L / 2L) %in%
        otree2$dictator$group_id)

    testthat::expect_true(all(c(test1, test2, test3)))

    # Test for increasing Ids
    # Test if group_ids are increasing with session_id
    otree2$dictator <- otree2$dictator[order(otree2$dictator$session_id,
                                             otree2$dictator$group_id), ]
    test1 <- all(diff(otree2$dictator$group_id) >= 0L)

    # Test if participant_ids are increasing with group_ids
    otree2$dictator <-
      otree2$dictator[order(otree2$dictator$group_id,
                            otree2$dictator$participant_id), ]

    test2 <- all(diff(otree2$dictator$participant_id) >= 0L)
    testthat::expect_true(all(c(test1, test2)))
  })

  testthat::test_that("Make IDs - from_var, other starts", {
    # Prepare data
    otree2 <- otree_5_4_0
    order_aaw_before <- otree2$all_apps_wide$participant.code
    order_dictator_before <- otree2$dictator$participant.code

    # Run function
    otree2 <- make_ids(otree2,
                       gmake = TRUE,
                       pmake = TRUE,
                       sstart = 3L,
                       gstart = 4L,
                       pstart = 8L,
                       from_var = "dictator.1.group.id_in_subsession")
    # Test
    # Test if order of DF entries did not change
    order_aaw_after <- otree2$all_apps_wide$participant.code
    order_dictator_after <- otree2$dictator$participant.code

    test1 <- all(order_aaw_before == order_aaw_after)
    test2 <- all(order_dictator_before == order_dictator_after)
    testthat::expect_true(all(c(test1, test2)))

    # Test if variables exist / don't exist
    test1 <- !is.null(otree2$all_apps_wide$group_id)
    test2 <- !is.null(otree2$all_apps_wide$session_id)
    test3 <- !is.null(otree2$all_apps_wide$participant_id)
    testthat::expect_true(all(c(test1, test2, test3)))

    # Test for minimum values
    test1 <- min(otree2$all_apps_wide$group_id) == 4L
    test2 <- min(otree2$all_apps_wide$session_id) == 3L
    test3 <- min(otree2$all_apps_wide$participant_id) == 8L
    testthat::expect_true(all(c(test1, test2, test3)))

    # Test for increasing IDs
    # Test if group_ids are increasing with session_id
    otree2$dictator <- otree2$dictator[order(otree2$dictator$session_id,
                                             otree2$dictator$group_id), ]
    test1 <- all(diff(otree2$dictator$group_id) >= 0L)

    # Test if participant_ids are increasing with group_ids
    otree2$dictator <-
      otree2$dictator[order(otree2$dictator$group_id,
                            otree2$dictator$participant_id), ]
    test2 <- all(diff(otree2$dictator$participant_id) >= 0L)
    testthat::expect_true(all(c(test1, test2)))
  })

  testthat::test_that("Make IDs - from_var,
                      dictator.1.group.id_in_subsession", {
    # Prepare data
    otree2 <- otree_5_4_0
    order_aaw_before <- otree2$all_apps_wide$dictator.1.player.payoff
    order_dictator_before <- otree2$dictator$player.payoff

    # Run function
    testthat::expect_no_warning(
      otree2 <- make_ids(otree2,
                         gmake = FALSE,  # will be overwritten by code!
                         pmake = FALSE,
                         from_var = "dictator.1.group.id_in_subsession"))

    # Test if order of DF entries did not change
    order_aaw_after <- otree2$all_apps_wide$dictator.1.player.payoff
    order_dictator_after <- otree2$dictator$player.payoff

    test1 <- order_aaw_before == order_aaw_after
    test2 <- order_dictator_before == order_dictator_after
    testthat::expect_true(all(c(test1, test2)))

    # Test if variables exist / don't exist
    test1 <- !is.null(otree2$all_apps_wide$group_id)
    test2 <- !is.null(otree2$all_apps_wide$session_id)
    test3 <- is.null(otree2$all_apps_wide$participant_id)
    testthat::expect_true(all(c(test1, test2, test3)))

    # Test if all IDs are there
    # No participants!
    test2 <- all(seq_along(unique(otree2$all_apps_wide$session.code))  %in%
                   otree2$all_apps_wide$session_id)
    test3 <- all(
      1L:(length(otree2$dictator$group_id) / 3L / 2L) %in%
        otree2$dictator$group_id)
    testthat::expect_true(all(c(test2, test3)))

    # Test for increasing IDs
    # Test if group_ids are increasing with session_id
    otree2$dictator <- otree2$dictator[order(otree2$dictator$session_id,
                                             otree2$dictator$group_id), ]
    test1 <- all(diff(otree2$dictator$group_id) >= 0L)
    testthat::expect_true(test1)
  })

  testthat::test_that("Make IDs - all the same", {
    # Prepare data (make group IDs all the same)
    otree2 <- otree_5_4_0

    otree2$all_apps_wide$start.1.group.id_in_subsession <-
      otree2$all_apps_wide$dictator.1.group.id_in_subsession

    otree2$all_apps_wide$survey.1.group.id_in_subsession <-
      otree2$all_apps_wide$dictator.1.group.id_in_subsession

    otree2$all_apps_wide$chatapp.1.group.id_in_subsession <-
      otree2$all_apps_wide$dictator.1.group.id_in_subsession

    order_aaw_before <- otree2$all_apps_wide$participant.code
    order_dictator_before <- otree2$dictator$participant.code

    # Run function
    otree2 <- make_ids(otree2, gmake = TRUE)

    # Test
    max_part <- length(otree2$all_apps_wide$participant.code)
    max_group <- length(
      unique(paste(otree2$all_apps_wide$session.code,
                   otree2$all_apps_wide$dictator.1.group.id_in_subsession)))

    max_session <- length(unique(otree2$all_apps_wide$session.code))

    testthat::expect_equal(
      max(otree2$all_apps_wide$participant_id, na.rm = TRUE), max_part)
    testthat::expect_equal(
      max(otree2$all_apps_wide$group_id, na.rm = TRUE), max_group)
    testthat::expect_equal(
      max(otree2$all_apps_wide$session_id, na.rm = TRUE), max_session)

    # Test if order of DF entries did not change
    order_aaw_after <- otree2$all_apps_wide$participant.code
    order_dictator_after <- otree2$dictator$participant.code

    test1 <- all(order_aaw_before == order_aaw_after)
    test2 <- all(order_dictator_before == order_dictator_after)
    testthat::expect_true(all(c(test1, test2)))

    # Test if all IDs are there
    test1 <- all(1L:max_part %in%
                   otree2$all_apps_wide$participant_id)
    test2 <- all(1L:max_session %in%
                   otree2$all_apps_wide$session_id)
    test3 <- all(
      1L:max_group %in%
        otree2$dictator$group_id)
    testthat::expect_true(all(c(test1, test2, test3)))
  })

  testthat::test_that("Make IDs - no time start", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$all_apps_wide$participant.time_started[
      seq_len(nrow(otree2$all_apps_wide))] <- NA
    order_aaw_before <- otree2$all_apps_wide$dictator.1.player.payoff
    order_dictator_before <- otree2$dictator$player.payoff

    # Run function
    otree2 <- make_ids(otree2)

    # Test if order of DF entries did not change
    order_aaw_after <- otree2$all_apps_wide$dictator.1.player.payoff
    order_dictator_after <- otree2$dictator$player.payoff

    test1 <- order_aaw_before == order_aaw_after
    test2 <- order_dictator_before == order_dictator_after
    testthat::expect_true(all(c(test1, test2)))

    # Test if variables exist / don't exist
    test1 <- !is.null(otree2$all_apps_wide$participant_id)
    test2 <- is.null(otree2$dictator$group_id)
    test3 <- !is.null(otree2$survey$participant_id)
    test4 <- is.null(otree2$survey$group_id)
    test5 <- !is.null(otree2$survey$session_id)

    testthat::expect_true(all(c(test1, test2, test3, test4, test5)))

    # Test - check if no two session codes have the same session id
    id_code_pairs <- unique(paste(
      otree2$all_apps_wide$session_id,
      otree2$all_apps_wide$session.code))

    numbers <- as.integer(sub("^([0-9]+).*", "\\1", id_code_pairs))
    strings <- sub("^[0-9]+ (.*)", "\\1", id_code_pairs)
    test1 <- !anyDuplicated(numbers)
    test2 <- !anyDuplicated(strings)

    testthat::expect_true(test1)
    testthat::expect_true(test2)

    # Test - check if no two participant codes have the same participant id
    id_code_pairs <- unique(paste(
      otree2$all_apps_wide$participant_id,
      otree2$all_apps_wide$participant.code))

    numbers <- as.integer(sub("^([0-9]+).*", "\\1", id_code_pairs))
    strings <- sub("^[0-9]+ (.*)", "\\1", id_code_pairs)
    test1 <- !anyDuplicated(numbers)
    test2 <- !anyDuplicated(strings)
    testthat::expect_true(all(c(test1, test2)))

    # Test if variables exist / don't exist
    test1 <-
      all(seq_along(unique(otree2$all_apps_wide$participant.code)) %in%
            otree2$all_apps_wide$participant_id)

    test2 <- all(seq_along(unique(otree2$all_apps_wide$session.code)) %in%
                   otree2$all_apps_wide$session_id)

    test3 <- is.null(otree2$dictator$group_id)

    test4 <- is.null(otree2$all_apps_wide$group_id)

    testthat::expect_true(all(c(test1, test2, test3, test4)))

    # Test for increasing IDs
    # Test if participant_ids are increasing with session_ids
    otree2$dictator <-
      otree2$dictator[order(otree2$dictator$session_id,
                            otree2$dictator$participant_id), ]

    test2 <- all(diff(otree2$dictator$participant_id) >= 0L)
    testthat::expect_true(all(c(test1, test2)))
  })

  testthat::test_that("Make IDs (w) - from_var - first constant", {
    # Prepare data (make all group variables to 1)
    otree2 <- otree_5_4_0
    order_aaw_before <- otree2$all_apps_wide$participant.code
    order_dictator_before <- otree2$dictator$participant.code

    otree2$all_apps_wide$dictator.1.group.id_in_subsession <-
      otree2$all_apps_wide$survey.1.group.id_in_subsession

    otree2$all_apps_wide$dictator.2.group.id_in_subsession <-
      otree2$all_apps_wide$survey.1.group.id_in_subsession

    otree2$all_apps_wide$dictator.3.group.id_in_subsession <-
      otree2$all_apps_wide$survey.1.group.id_in_subsession

    otree2$all_apps_wide$chatapp.1.group.id_in_subsession <-
      otree2$all_apps_wide$survey.1.group.id_in_subsession

    # Run function
    testthat::expect_warning(

      otree2 <- make_ids(otree2,
                         gmake = TRUE,
                         icw = TRUE),
      paste0(
        "The group variable values \\(of the first group variable\\) ",
        "are constant. ",
        "Group IDs now correspond to session IDs."))

    # Test
    test1 <- all(otree2$all_apps_wide$group_id ==
                   otree2$all_apps_wide$session_id)
    testthat::expect_true(test1)

    # Test if order of DF entries did not change
    order_aaw_after <- otree2$all_apps_wide$participant.code
    order_dictator_after <- otree2$dictator$participant.code

    test1 <- all(order_aaw_before == order_aaw_after)
    test2 <- all(order_dictator_before == order_dictator_after)
    testthat::expect_true(all(c(test1, test2)))

    # Test - check if no two session codes have the same session id
    id_code_pairs <- unique(paste(
      otree2$all_apps_wide$session_id,
      otree2$all_apps_wide$session.code))

    numbers <- as.integer(sub("^([0-9]+).*", "\\1", id_code_pairs))
    strings <- sub("^[0-9]+ (.*)", "\\1", id_code_pairs)
    test1 <- !anyDuplicated(numbers)
    test2 <- !anyDuplicated(strings)
    testthat::expect_true(all(c(test1, test2)))

    # Test - check if no two participant codes have the same participant id
    id_code_pairs <- unique(paste(
      otree2$all_apps_wide$participant_id,
      otree2$all_apps_wide$participant.code))

    numbers <- as.integer(sub("^([0-9]+).*", "\\1", id_code_pairs))
    strings <- sub("^[0-9]+ (.*)", "\\1", id_code_pairs)
    test1 <- !anyDuplicated(numbers)
    test2 <- !anyDuplicated(strings)
    testthat::expect_true(all(c(test1, test2)))

    # Test if all IDs are there
    test1 <-
      all(seq_along(unique(otree2$all_apps_wide$participant.code)) %in%
            otree2$all_apps_wide$participant_id)

    test2 <- all(seq_along(unique(otree2$all_apps_wide$session.code)) %in%
                   otree2$all_apps_wide$session_id)

    test3 <-
      otree2$all_apps_wide$session_id == otree2$all_apps_wide$group_id

    testthat::expect_true(all(c(test1, test2, test3)))
  })

  testthat::test_that("Make IDs - from_app", {
    # Prepare data
    otree2 <- otree_5_4_0
    order_aaw_before <- otree2$all_apps_wide$participant.code
    order_dictator_before <- otree2$dictator$participant.code

    # Run function
    otree2 <- make_ids(otree2, gmake = TRUE, from_app = "dictator")

    # Test if order of DF entries did not change
    order_aaw_after <- otree2$all_apps_wide$participant.code
    order_dictator_after <- otree2$dictator$participant.code

    test1 <- all(order_aaw_before == order_aaw_after)
    test2 <- all(order_dictator_before == order_dictator_after)
    testthat::expect_true(all(c(test1, test2)))

    # Test
    test_participant <-
      unique(sort(otree2$all_apps_wide$participant.code))

    testthat::expect_length(otree2$all_apps_wide$participant_id,
                               length(test_participant))

    # Test if variables exist / don't exist
    test1 <- !is.null(otree2$dictator$group_id)
    test2 <- !is.null(otree2$dictator$session_id)
    testthat::expect_true(test1)
    testthat::expect_true(test2)

    # Test if all IDs are there
    test1 <-
      all(seq_along(unique(otree2$all_apps_wide$participant.code)) %in%
            otree2$all_apps_wide$participant_id)

    test2 <- all(seq_along(unique(otree2$all_apps_wide$session.code)) %in%
                   otree2$all_apps_wide$session_id)

    test3 <- all(
      1L:(length(otree2$dictator$group_id) / 3L / 2L) %in%
        otree2$dictator$group_id)

    testthat::expect_true(all(c(test1, test2, test3)))
  })

  testthat::test_that("Make IDs - from_app, random_df", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$random_dataframe <- data.frame(
      a = c(1L, 2L, 3L),
      b = c(4L, 5L, 6L),
      c = c(7L, 8L, 9L))

    # Run function and test
    testthat::expect_error(
      otree2 <- make_ids(otree2,
                         gmake = TRUE,
                         from_app = "random_dataframe"),
      "Your from_app is not a normal oTree")
  })

  testthat::test_that("Make IDs - one participant not in from_app", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2 <- delete_duplicate(otree2)
    delsomedictators <- unique(otree2$dictator$participant.code)[1L]
    otree2$dictator <-  otree2$dictator[
      !(otree2$dictator$participant.code %in% delsomedictators), ]
    order_aaw_before <- otree2$all_apps_wide$participant.code
    order_dictator_before <- otree2$dictator$participant.code

    # Run function
    testthat::expect_warning(
      otree2 <- make_ids(otree2, gmake = TRUE, from_app = "dictator"),
      "all_apps_wide.*chatapp.*start.*survey.*Time.*has more participants than")

    # Test
    # Test if order of DF entries did not change
    order_aaw_after <- otree2$all_apps_wide$participant.code
    order_dictator_after <- otree2$dictator$participant.code

    test1 <- all(order_aaw_before == order_aaw_after)
    test2 <- all(order_dictator_before == order_dictator_after)
    testthat::expect_true(all(c(test1, test2)))

    # Test
    test_participant <-
      unique(sort(otree2$all_apps_wide$participant.code))

    testthat::expect_length(otree2$all_apps_wide$participant_id,
                               length(test_participant))

    # Test if variables exist / don't exist
    test1 <- !is.null(otree2$dictator$group_id)
    test2 <- !is.null(otree2$dictator$session_id)
    testthat::expect_true(test1)
    testthat::expect_true(test2)

    # Test if all IDs are there
    test1 <-
      all(
        1L:(length(unique(otree2$all_apps_wide$participant.code)) - 1L) %in%
          otree2$all_apps_wide$participant_id)
    test2 <- all(seq_along(unique(otree2$all_apps_wide$session.code)) %in%
                   otree2$all_apps_wide$session_id)
    test3 <- all(
      1L:(length(otree2$dictator$group_id) / 3L / 2L) %in%
        otree2$dictator$group_id)
    testthat::expect_true(all(c(test1, test2, test3)))
  })

  testthat::test_that("Make IDs - from_var constant", {
    # Prepare data
    otree2 <- otree_5_4_0
    order_aaw_before <- otree2$all_apps_wide$participant.code
    order_dictator_before <- otree2$dictator$participant.code

    # Run function
    testthat::expect_warning(
      otree2 <- make_ids(otree2,
                         gmake = TRUE,
                         from_app = "survey"),
      "values are constant")

    # Test if order of DF entries did not change
    order_aaw_after <- otree2$all_apps_wide$participant.code
    order_dictator_after <- otree2$dictator$participant.code

    test1 <- all(order_aaw_before == order_aaw_after)
    test2 <- all(order_dictator_before == order_dictator_after)
    testthat::expect_true(all(c(test1, test2)))

    # Test
    testthat::expect_identical(otree2$group_id, otree2$session_id)

    # Test if variables exist / don't exist
    test1 <- !is.null(otree2$all_apps_wide$participant_id)
    test2 <- !is.null(otree2$dictator$group_id)
    test3 <- !is.null(otree2$survey$participant_id)
    test4 <- !is.null(otree2$survey$group_id)
    test5 <- !is.null(otree2$survey$session_id)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5)))

    # Test if all IDs are there
    test1 <- all(
      seq_along(unique(otree2$all_apps_wide$participant.code)) %in%
        otree2$all_apps_wide$participant_id)

    test2 <- all(seq_along(unique(otree2$all_apps_wide$session.code)) %in%
                   otree2$all_apps_wide$session_id)
    test3 <- all(
      otree2$all_apps_wide$session_id == otree2$all_apps_wide$group_id)
    testthat::expect_true(all(c(test1, test2, test3)))

    # Test for increasing IDs
    # Test if group_ids are increasing with session_id
    otree2$dictator <- otree2$dictator[order(otree2$dictator$session_id,
                                             otree2$dictator$group_id), ]
    test1 <- all(diff(otree2$dictator$group_id) >= 0L)

    # Test if participant_ids are increasing with group_ids
    otree2$dictator <-
      otree2$dictator[order(otree2$dictator$group_id,
                            otree2$dictator$participant_id), ]
    test2 <- all(diff(otree2$dictator$participant_id) >= 0L)
    testthat::expect_true(all(c(test1, test2)))
  })

  testthat::test_that("Make IDs - others more cases than from-app", {
    # Info: Cases are then shown as NA
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$dictator <- otree2$dictator[7L:nrow(otree2$dictator), ]
    order_aaw_before <- otree2$all_apps_wide$participant.code
    order_dictator_before <- otree2$dictator$participant.code

    # Run function
    testthat::expect_warning(
      otree2 <- make_ids(otree2,
                         gmake = TRUE,
                         from_app = "dictator"),
      "has more participants than")

    # Test
    # Test if order of DF entries did not change
    order_aaw_after <- otree2$all_apps_wide$participant.code
    order_dictator_after <- otree2$dictator$participant.code

    test1 <- all(order_aaw_before == order_aaw_after)
    test2 <- all(order_dictator_before == order_dictator_after)
    testthat::expect_true(all(c(test1, test2)))

    # Test
    test_participant <-
      unique(sort(otree2$all_apps_wide$participant.code))

    testthat::expect_length(
      otree2$all_apps_wide$participant_id,
      length(test_participant))

    # Test if variables exist / don't exist
    test1 <- !is.null(otree2$dictator$group_id)
    test2 <- !is.null(otree2$dictator$session_id)
    test3 <- !is.null(otree2$dictator$participant_id)

    # Test if NAs are there
    test4 <- NA %in% otree2$all_apps_wide$participant_id
    testthat::expect_true(all(c(test1, test2, test3, test4)))

    # Test if all IDs are there
    # Bit more complicated here, because some IDs are NA
    test1 <-
      all(1L:(length(otree2$all_apps_wide$participant.code) -
                sum(is.na(otree2$all_apps_wide$participant_id))) %in%
            otree2$all_apps_wide$participant_id)

    test2 <-
      all(1L:(length(unique(otree2$all_apps_wide$session.code)) - 1L) %in%
            otree2$all_apps_wide$session_id)

    test3 <- all(
      1L:(length(otree2$dictator$group_id) / 3L / 2L) %in%
        otree2$dictator$group_id)

    testthat::expect_true(all(c(test1, test2, test3)))

    # Test for NAs
    test1 <- NA %in% otree2$all_apps_wide$participant_id
    test2 <- NA %in% otree2$all_apps_wide$group_id
    test3 <- NA %in% otree2$all_apps_wide$session_id
    testthat::expect_true(all(c(test1, test2, test3)))

    # Test for increasing IDs
    # Test if group_ids are increasing with session_id
    otree2$dictator <- otree2$dictator[order(otree2$dictator$session_id,
                                             otree2$dictator$group_id), ]
    test1 <- all(diff(otree2$dictator$group_id) >= 0L)

    # Test if participant_ids are increasing with group_ids
    otree2$dictator <-
      otree2$dictator[order(otree2$dictator$group_id,
                            otree2$dictator$participant_id), ]
    test2 <- all(diff(otree2$dictator$participant_id) >= 0L)
    testthat::expect_true(all(c(test1, test2)))
  })

  testthat::test_that("Make IDs - from_app more cases than all apps wide", {
    # Prepare data
    otree2 <- otree_5_4_0
    delperson <- otree2$dictator$participant.code[1L]

    otree2$all_apps_wide <-
      otree2$all_apps_wide[
        otree2$all_apps_wide$participant.code != delperson, ]
    order_aaw_before <- otree2$all_apps_wide$participant.code
    order_dictator_before <- otree2$dictator$participant.code

    # Run function
    otree2 <- make_ids(otree2,
                       gmake = TRUE,
                       from_app = "dictator")

    # Test
    test_participant <-
      unique(otree2$all_apps_wide$participant.code)

    testthat::expect_length(otree2$all_apps_wide$participant_id,
                            length(test_participant))

    # Test if order of DF entries did not change
    order_aaw_after <- otree2$all_apps_wide$participant.code
    order_dictator_after <- otree2$dictator$participant.code

    test1 <- all(order_aaw_before == order_aaw_after)
    test2 <- all(order_dictator_before == order_dictator_after)
    testthat::expect_true(all(c(test1, test2)))

    # Test if variables are there and not NA
    test1 <- !is.null(otree2$dictator$group_id)
    test2 <- !anyNA(otree2$dictator$group_id)
    test3 <- !is.null(otree2$dictator$session_id)
    test4 <- !anyNA(otree2$dictator$session_id)
    test5 <- !is.null(otree2$dictator$participant_id)
    test6 <- !anyNA(otree2$dictator$participant_id)
    testthat::expect_true(all(c(test1, test2, test3, test4, test5, test6)))

    # Test if values are not there twice
    test <- !anyDuplicated(otree2$all_apps_wide$participant_id)
    testthat::expect_true(test)

    # Test if all IDs are there
    test1 <- all(2L:(length(otree2$all_apps_wide$participant.code)) %in%
                   otree2$all_apps_wide$participant_id)
    test2 <- all(seq_along(unique(otree2$all_apps_wide$session.code)) %in%
                   otree2$all_apps_wide$session_id)
    test3 <- all(
      1L:(length(otree2$dictator$group_id) / 3L / 2L) %in%
        otree2$dictator$group_id)

    testthat::expect_true(test1)
    testthat::expect_true(test2)
    testthat::expect_true(test3)

    # Test for increasing IDs
    # Test if group_ids are increasing with session_id
    otree2$dictator <- otree2$dictator[order(otree2$dictator$session_id,
                                             otree2$dictator$group_id), ]
    test1 <- all(diff(otree2$dictator$group_id) >= 0L)

    # Test if participant_ids are increasing with group_ids
    otree2$dictator <-
      otree2$dictator[order(otree2$dictator$group_id,
                            otree2$dictator$participant_id), ]
    test2 <- all(diff(otree2$dictator$participant_id) >= 0L)
    testthat::expect_true(all(c(test1, test2)))
  })

  testthat::test_that("Make IDs (w) - from_var constant", {
    # Prepare data
    otree2 <- otree_5_4_0
    order_aaw_before <- otree2$all_apps_wide$dictator.1.player.payoff
    order_dictator_before <- otree2$dictator$player.payoff

    # Run function
    testthat::expect_warning(
      otree2 <- make_ids(otree2,
                         from_var = "survey.1.group.id_in_subsession"),
      "The group variable values are constant")

    # Test if order of DF entries did not change
    order_aaw_after <- otree2$all_apps_wide$dictator.1.player.payoff
    order_dictator_after <- otree2$dictator$player.payoff

    test1 <- order_aaw_before == order_aaw_after
    test2 <- order_dictator_before == order_dictator_after
    testthat::expect_true(all(c(test1, test2)))

    # Test
    testthat::expect_identical(otree2$all_apps_wide$group_id,
                               otree2$all_apps_wide$session_id)

    # Test if variables are there and not NA
    test1 <- !is.null(otree2$dictator$group_id)
    test2 <- !anyNA(otree2$dictator$group_id)
    test3 <- !is.null(otree2$dictator$participant_id)
    test4 <- !anyNA(otree2$dictator$participant_id)
    testthat::expect_true(all(c(test1, test2, test3, test4)))

    # Test if all IDs are there
    test1 <-
      all(seq_along(unique(otree2$all_apps_wide$participant.code)) %in%
            otree2$all_apps_wide$participant_id)

    test2 <- all(seq_along(unique(otree2$all_apps_wide$session.code)) %in%
                   otree2$all_apps_wide$session_id)

    # Because group is constant:
    test3 <- all(seq_along(unique(otree2$all_apps_wide$session.code)) %in%
                   otree2$all_apps_wide$group_id)

    testthat::expect_true(all(c(test1, test2, test3)))

    # Test for increasing IDs
    # Test if group_ids are increasing with session_id
    otree2$dictator <- otree2$dictator[order(otree2$dictator$session_id,
                                             otree2$dictator$group_id), ]
    test1 <- all(diff(otree2$dictator$group_id) >= 0L)

    # Test if participant_ids are increasing with group_ids
    otree2$dictator <-
      otree2$dictator[order(otree2$dictator$group_id,
                            otree2$dictator$participant_id), ]
    test2 <- all(diff(otree2$dictator$participant_id) >= 0L)
    testthat::expect_true(all(c(test1, test2)))
  })

  testthat::test_that("Make IDs (w) - constant group variable", {
    # Prepare data
    otree2 <- otree_5_4_0
    order_aaw_before <- otree2$all_apps_wide$dictator.1.player.payoff
    order_dictator_before <- otree2$dictator$player.payoff

    # Run function
    testthat::expect_warning(
      otree2 <- make_ids(otree2,
                         gmake = TRUE,
                         from_app = "survey"),
      "group variable values are constant")

    # Test if order of DF entries did not change
    order_aaw_after <- otree2$all_apps_wide$dictator.1.player.payoff
    order_dictator_after <- otree2$dictator$player.payoff

    test1 <- order_aaw_before == order_aaw_after
    test2 <- order_dictator_before == order_dictator_after
    testthat::expect_true(all(c(test1, test2)))

    # Test
    test1 <- !is.null(otree2$all_apps_wide$participant_id)
    test2 <- !is.null(otree2$dictator$group_id)
    test3 <- !is.null(otree2$survey$participant_id)
    test4 <- !is.null(otree2$survey$group_id)
    test5 <- !is.null(otree2$survey$session_id)
    test6 <- otree2$survey$group_id == otree2$survey$session_id
    test7 <-
      otree2$all_apps_wide$group_id == otree2$all_apps_wide$session_id

    testthat::expect_true(all(c(test1, test2, test3,
                                test4, test5, test6,
                                test7)))

    # Test if all IDs are there
    test1 <- all(seq_along(
      unique(otree2$all_apps_wide$participant.code)) %in%
        otree2$all_apps_wide$participant_id)

    test2 <- all(seq_along(unique(otree2$all_apps_wide$session.code)) %in%
                   otree2$all_apps_wide$session_id)

    testthat::expect_true(test1)
    testthat::expect_true(test2)

    # Test for increasing IDs
    # Test if group_ids are increasing with session_id
    otree2$dictator <- otree2$dictator[order(otree2$dictator$session_id,
                                             otree2$dictator$group_id), ]
    test1 <- all(diff(otree2$dictator$group_id) >= 0L)

    # Test if participant_ids are increasing with group_ids
    otree2$dictator <-
      otree2$dictator[order(otree2$dictator$group_id,
                            otree2$dictator$participant_id), ]
    test2 <- all(diff(otree2$dictator$participant_id) >= 0L)
    testthat::expect_true(all(c(test1, test2)))
  })

  testthat::test_that("Make IDs (w) - from_var -
                      no participant code variable", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2 <- delete_duplicate(otree2)
    otree2$survey$participant.code <- NULL
    order_aaw_before <- otree2$all_apps_wide$dictator.1.player.payoff
    order_dictator_before <- otree2$dictator$player.payoff

    # Run function
    testthat::expect_warning(
      otree2 <- make_ids(otree2,
                         gmake = TRUE,
                         pmake = TRUE,
                         from_app = "dictator"),
      "Participant code variable couldn't be found")

    # Test if order of DF entries did not change
    order_aaw_after <- otree2$all_apps_wide$dictator.1.player.payoff
    order_dictator_after <- otree2$dictator$player.payoff

    test1 <- order_aaw_before == order_aaw_after
    test2 <- order_dictator_before == order_dictator_after
    testthat::expect_true(all(c(test1, test2)))

    # Test
    test1 <- !is.null(otree2$all_apps_wide$participant_id)
    test2 <- !is.null(otree2$dictator$group_id)
    test3 <- is.null(otree2$survey$participant_id)
    test4 <- is.null(otree2$survey$group_id)
    test5 <- is.null(otree2$survey$session_id)

    testthat::expect_true(all(c(test1, test2, test3, test4, test5)))

    # Test if all IDs are there
    test1 <- all(seq_along(unique(otree2$all_apps_wide$participant.code))
                 %in% otree2$all_apps_wide$participant_id)
    test2 <- all(seq_along(unique(otree2$all_apps_wide$session.code)) %in%
                   otree2$all_apps_wide$session_id)
    test3 <- all(
      1L:(length(otree2$dictator$group_id) / 3L / 2L) %in%
        otree2$dictator$group_id)

    testthat::expect_true(all(c(test1, test2, test3)))

    # Test for increasing IDs
    # Test if group_ids are increasing with session_id
    otree2$dictator <- otree2$dictator[order(otree2$dictator$session_id,
                                             otree2$dictator$group_id), ]
    test1 <- all(diff(otree2$dictator$group_id) >= 0L)

    # Test if participant_ids are increasing with group_ids
    otree2$dictator <-
      otree2$dictator[order(otree2$dictator$group_id,
                            otree2$dictator$participant_id), ]
    test2 <- all(diff(otree2$dictator$participant_id) >= 0L)
    testthat::expect_true(all(c(test1, test2)))
  })

  testthat::test_that("Make IDs (e) - empty rows - from app aaw", {
    # If there are empty rows, an error occurs
    # Prepare data
    testthat::expect_warning(
      otree2 <- import_otree(
        del_empty = FALSE,
        path = testthat::test_path("testdata", "exp_data_5.4.0"),
        onlybots = FALSE,
        csv = TRUE,
        info = FALSE), "globally but also room-specific")

    testthat::expect_error(
      otree2 <- make_ids(otree2,
                         pmake = TRUE,
                         gmake = TRUE,
                         from_var = "dictator.1.group.id_in_subsession",
                         emptyrows = "yes"),
      "length of participant codes is not equal the length of unique")

  })

  testthat::test_that("Make IDs (e) - empty rows - from app dictator", {
    # If there are empty rows, an error occurs
    # Prepare data
    testthat::expect_warning(
      otree2 <- import_otree(
        del_empty = FALSE,
        path =  testthat::test_path("testdata", "exp_data_5.4.0"),
        onlybots = FALSE,
        csv = TRUE,
        info = FALSE),
      "globally but also room-specific")

    # Run function and test
    testthat::expect_error(
      otree2 <- make_ids(otree2,
                         pmake = TRUE,
                         gmake = TRUE,
                         from_app = "dictator",
                         emptyrows = "yes"),
      "The length of participant codes is not equal the length of unique part")
  })

  testthat::test_that("Make IDs (e) - empty rows yes", {
    # Prepare data
    otree2 <- otree_new_empty

    ans <- "yes"
    my_file <- textConnection(ans)

    withr::with_options(
      list(mypkg.connection = my_file),
      {
        # Capture the output of make_ids
        output <- capture.output(
          make_ids(otree2,
                   pmake = TRUE,
                   gmake = TRUE,
                   from_var = "dictator.1.group.id_in_subsession"))

        # Test if the output from the cat() function is shown
        cat_output_displayed <-
          any(grepl("Your from_app contains empty rows", output))

        testthat::expect_true(cat_output_displayed)
    })

    close(my_file)
  })

  testthat::test_that("Make IDs (e) - empty rows no", {
    # Prepare data
    otree2 <- otree_new_empty

    ans <- paste("no")
    my_file <- textConnection(ans)

    withr::with_options(
      list(mypkg.connection = my_file),
      {
        # Capture the output of make_ids
        testthat::expect_error(
          output <- capture.output(
            make_ids(otree2,
                     pmake = TRUE,
                     gmake = TRUE,
                     from_var = "dictator.1.group.id_in_subsession")),
          "You chose to stop this function")
      }
    )

    close(my_file)
  })

  testthat::test_that("Make IDs (e) - duplicate data", {
    # Prepare data
    otree2 <- otree_5_4_0_non_unique

    # Run function and test
    testthat::expect_error(
      make_ids(otree2,
               pmake = TRUE,
               gmake = TRUE,
               from_var = "dictator.1.group.id_in_subsession",
               emptyrows = "yes"),
      "length of participant codes is not equal the length of unique")
  })

  testthat::test_that("Make IDs (e) - wrong from_app", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(make_ids(otree2,
                                    gmake = TRUE,
                                    from_app = "Chats",
                                    emptyrows = "yes"),
                           "You can not use ")
  })

  testthat::test_that("Make IDs (e) - no participant.code", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$all_apps_wide$participant.code <- NULL

    # Run function and test
    testthat::expect_error(make_ids(otree2,
                                    gmake = FALSE,
                                    emptyrows = "yes"),
                           "There is no participant.code in")
  })

  testthat::test_that("Make IDs (e) - participant.code is NA", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$all_apps_wide$participant.code <- NA

    # Run function and test
    testthat::expect_error(make_ids(otree2,
                                    gmake = FALSE,
                                    emptyrows = "yes"),
                           "There are NAs in your participant.code")
  })

  testthat::test_that("Make IDs (e) - from_app not found", {
    # Prepare data
    otree2 <- otree_2_2_4

    # Run function and test
    testthat::expect_error(make_ids(otree2,
                                    gmake = TRUE,
                                    from_app = "xyz",
                                    emptyrows = "yes"),
                           "not found")
  })

  testthat::test_that("Make IDs (e) - from_app not data frame", {
    # Prepare data
    otree2 <- otree_2_2_4
    otree2$notadataframe <- c(1L, 2L, 3L)

    # Run function
    testthat::expect_error(make_ids(otree2, gmake = TRUE,
                                    from_app = "notadataframe"),
                           "not a data frame")
  })

  testthat::test_that("Make IDs (e) - from_app empty data frame", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$emptydataframe <- data.frame()

    # Run function and test
    testthat::expect_error(
      make_ids(otree2,
              gmake = TRUE,
              from_app = "emptydataframe"),
     "Your from_app is not a normal oTree all_apps_wide or apps data frame.")
  })

  testthat::test_that("Make IDs (e) - from_app empty data frame", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Make empty data frame
    otree2$survey <- otree2$survey[NULL, ]

    # Run function and test
    testthat::expect_error(make_ids(otree2,
                                    gmake = TRUE,
                                    from_app = "survey"),
                           "has no entries")
  })

  testthat::test_that("Make IDs (e) - no variable", {
    # Prepare data (delete group_id)
    otree2 <- otree_5_4_0
    otree2$all_apps_wide <- otree2$all_apps_wide[
      , !(endsWith(names(otree2$all_apps_wide), "group.id_in_subsession"))]

    # Run function and test
    testthat::expect_error(make_ids(otree2,
                                    gmake = TRUE),
                           "No variable that ends with")
  })

  testthat::test_that("Make IDs (e) - group_id cannot be calculated", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(make_ids(otree2, gmake = TRUE),
                           "roup_id can not be calculated")
  })

  testthat::test_that("Make IDs (e) - participant_code
                      and participant__code", {
    # Prepare data
    otree2 <- otree_all

    # Run function and test
    testthat::expect_error(
      make_ids(otree2, gmake = TRUE),
      "You combined data.*messy_time.*messy_chat")
  })

  testthat::test_that("Make IDs (e) - participant_code and
                      participant__code", {
    # Prepare data
    otree2 <- otree_all
    otree2 <- messy_time(otree2, combine = TRUE)

    # Run function
    error <- tryCatch(
      make_ids(otree2, gmake = TRUE),
      error = function(e) e)

    # Test
    testthat::expect_true(grepl(
      "You combined data from old and new oTree versions", error))
    testthat::expect_false(grepl(
      "messy_time", error))
    testthat::expect_true(grepl(
      "messy_chat", error))
  })

  testthat::test_that("Make IDs (e) - participant_code
                      and participant__code", {
    # Prepare data
    otree2 <- otree_all
    otree2 <- messy_chat(otree2, combine = TRUE)

    # Run function
    error <- tryCatch(
      make_ids(otree2, gmake = TRUE),
      error = function(e) e)

    # Test
    testthat::expect_true(grepl(
      "You combined data from old and new oTree versions", error))
    testthat::expect_false(grepl(
      "messy_chat", error))
    testthat::expect_true(grepl(
      "messy_time", error))
  })

  testthat::test_that("Make IDs (e) - NA in participant__code", {
    # Prepare data
    otree2 <- otree_2_2_4

    # Only NAs in participant_code
    otree2$Chats$participant__code[1L] <- NA

    # Run function and test
    testthat::expect_error(
      make_ids(otree2,
               gmake = TRUE),
      "There are NAs in your participant__code variable in the")
  })

  testthat::test_that("Make IDs (e) - NA in participant_code", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$Chats$participant_code[1L] <- NA

    # Run function and test
    testthat::expect_error(
      make_ids(otree2,
               gmake = TRUE),
      "There are NAs in your participant_code variable in the")
  })

  testthat::test_that("Make IDs (e) - session_code and session__code", {
    # Prepare data
    otree2 <- otree_all

    # Run function and test
    testthat::expect_error(
      make_ids(otree2,
               gmake = FALSE),
      "You combined data from old and new oTree versions")
  })

  testthat::test_that("Make IDs (e) - group_id not the same", {
    otree2 <- otree_5_4_0
    testthat::expect_error(
      make_ids(otree2,
               gmake = TRUE),
      "You don't have the same group.id_in_subsession in every app")
  })

  testthat::test_that("Make IDs (e) - only use from_app or from_var", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(
      make_ids(oTree = otree2,
               from_app = "dictator",
               from_var = "dictator.1.group.id_in_subsession",
               gmake = TRUE),
      "Please only use")
  })

  testthat::test_that("Make IDs (e) - from_var constant - nondistinct", {
    # Prepare data
    otree2 <- otree_5_4_0_non_unique

    # Run function and test
    testthat::expect_error(
      otree2 <- make_ids(otree2,
                         from_var = "survey.1.group.id_in_subsession"),
      "length of participant codes is not equal the length of unique")
  })

  testthat::test_that("Make IDs (e) - from_var not found", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(make_ids(otree2,
                                    gmake = TRUE,
                                    from_var = "donotfind"),
                           "not found")

    # Test if variables exist / don't exist
    test1 <- is.null(otree2$all_apps_wide$group_id)
    test2 <- is.null(otree2$all_apps_wide$participant_id)
    test3 <- is.null(otree2$all_apps_wide$session_id)
    testthat::expect_true(all(c(test1, test2, test3)))
  })

  testthat::test_that("Make IDs (e) - from_var not found,
                      session codes Na", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$all_apps_wide$session.code[c(1L, 5L, 3L)] <- NA

    # Run function
    testthat::expect_error(

      otree2 <- make_ids(otree2,
                         gmake = TRUE,
                         from_var = "donotfind"),
      "from_var.*not found")

    # Test if variables exist / don't exist
    test1 <- is.null(otree2$all_apps_wide$group_id)
    test2 <- is.null(otree2$all_apps_wide$participant_id)
    test3 <- is.null(otree2$all_apps_wide$session_id)
    testthat::expect_true(all(c(test1, test2, test3)))
  })

  testthat::test_that("Make IDs (e) - chat_warning", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$Chats$participant_code <- 1L

    # Run function and test
    testthat::expect_error(make_ids(otree2, icw = FALSE),
                           "bug")
  })

  testthat::test_that("Make IDs (e) - wrong from_var", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(make_ids(otree2, from_var = "gender"),
                           "not found")
  })

  testthat::test_that("Make IDs (e) - from_app & data there twice", {
    # Prepare data
    otree3 <- otree_5_4_0
    otree3$all_apps_wide <- rbind(otree3$all_apps_wide,
                                  otree3$all_apps_wide)
    otree3$dictator <- rbind(otree3$dictator, otree3$dictator)

    # Run function and test
    testthat::expect_error(
      otree3 <- make_ids(otree3, gmake = TRUE, from_app = "dictator"),
      "The length of participant codes is not equal")
  })

  testthat::test_that("Make IDs - from_app (old)", {
    # Prepare data
    otree2 <- otree_2_2_4
    otree2 <- delete_duplicate(otree2)
    otree2$all_apps_wide$session.code
    otree2$dictator$session.code
    order_aaw_before <- otree2$all_apps_wide$participant.code
    order_dictator_before <- otree2$dictator$participant.code

    # Run function
    otree2 <- make_ids(otree2,
                       gmake = TRUE,
                       from_app = "dictator",
                       emptyrows = "yes")
    # Test
    testthat::expect_equal(max(otree2$dictator$participant_id),
                           length(unique(otree2$dictator$participant.code)))
    testthat::expect_equal(max(otree2$dictator$group_id), 6L)
    testthat::expect_equal(max(otree2$dictator$session_id), 2L)

    # Test if variables exist / don't exist
    test1 <- !is.null(otree2$all_apps_wide$participant_id)
    test2 <- !is.null(otree2$dictator$group_id)
    test3 <- !is.null(otree2$survey$participant_id)
    test4 <- !is.null(otree2$survey$group_id)
    test5 <- !is.null(otree2$survey$session_id)

    testthat::expect_true(all(c(test1, test2, test3, test4, test5)))

    # Test if order of DF entries did not change
    order_aaw_after <- otree2$all_apps_wide$participant.code
    order_dictator_after <- otree2$dictator$participant.code

    test1 <- all(order_aaw_before == order_aaw_after)
    test2 <- all(order_dictator_before == order_dictator_after)
    testthat::expect_true(all(c(test1, test2)))

    # Test - check if no two session codes have the same session id
    id_code_pairs <- unique(paste(
      otree2$all_apps_wide$session_id,
      otree2$all_apps_wide$session.code))

    numbers <- as.integer(sub("^([0-9]+).*", "\\1", id_code_pairs))
    strings <- sub("^[0-9]+ (.*)", "\\1", id_code_pairs)
    test1 <- !anyDuplicated(numbers)
    testthat::expect_true(test1)
    test2 <- !anyDuplicated(strings)
    testthat::expect_true(test2)

    # Test - check if no two participant codes have the same participant id
    id_code_pairs <- unique(paste(
      otree2$all_apps_wide$participant_id,
      otree2$all_apps_wide$participant.code))

    numbers <- as.integer(sub("^([0-9]+).*", "\\1", id_code_pairs))
    strings <- sub("^[0-9]+ (.*)", "\\1", id_code_pairs)
    test1 <- !anyDuplicated(numbers)
    testthat::expect_true(test1)
    test2 <- !anyDuplicated(strings)
    testthat::expect_true(test2)
  })

  # Experiment time   ####
  testthat::test_that("extime - all oTree", {
    # Prepare data
    otree2 <- otree_all
    testthat::expect_warning(
      otree2 <- messy_time(otree2, combine = TRUE, info = TRUE),
      "referred to the time stamp.*participant code")

    # Run function
    output <- extime(otree2)

    # Test
    # Test if variables exist / don't exist
    test1 <- !is.null(output$mean_duration) & !is.na(output$mean_duration)
    test2 <- !is.null(output$min_duration) & !is.na(output$min_duration)
    test3 <- !is.null(output$max_duration) & !is.na(output$max_duration)
    test4 <- exists("single_durations", output)

    # Test if the values and the single_durations align
    test5 <- round(output$min_duration, 2L) ==
      round(min(output$single_durations$duration), 2L)
    test6 <- round(output$max_duration, 2L) ==
      round(max(output$single_durations$duration), 2L)
    test7 <- round(output$mean_duration, 2L) ==
      round(mean(output$single_durations$duration), 2L)
    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6, test7)))
  })

  testthat::test_that("extime - new otree", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function
    output <- extime(otree2, startat = 1L)

    # Test

    # Test if variables exist / don't exist
    test1 <- !is.null(output$mean_duration) & !is.na(output$mean_duration)
    test2 <- !is.null(output$min_duration) & !is.na(output$min_duration)
    test3 <- !is.null(output$max_duration) & !is.na(output$max_duration)
    test4 <- exists("single_durations", output)

    # Test if the values and the single_durations align
    test5 <- round(output$min_duration, 2L) ==
      round(min(output$single_durations$duration), 2L)
    test6 <- round(output$max_duration, 2L) ==
      round(max(output$single_durations$duration), 2L)
    test7 <- round(output$mean_duration, 2L) ==
      round(mean(output$single_durations$duration), 2L)
    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6, test7)))

  })

  testthat::test_that("extime - new oTree - secondsonpage2", {
    # Calculation not with time stamp but with secondsonpage2
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function
    output <- extime(otree2)
    otree3 <- pagesec(otree2)
    otree3$Time$epoch_time_completed <- NULL
    output2 <- extime(otree3)

    # Test
    test1 <- output$mean_duration == output2$mean_duration
    test2 <- output$min_duration & output2$min_duration
    test3 <- output$min_duration & output2$min_duration
    test4 <- exists("single_durations", output2)

    test6 <- round(mean(output2$single_durations$duration),
                   digits = 2L) == output2$mean_duration

    testthat::expect_true(all(c(test1, test2, test3,
                                test4, test6)))
  })

  testthat::test_that("extime - new otree seconds on page error", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function
    otree2 <- pagesec(otree2)
    otree2$Time$epoch_time_completed <- NULL

    testthat::expect_error(
      extime(otree2,
             startat = "real",
             sinfo = NULL),
      "There is no variable referring to the time stamp"
    )
  })

  testthat::test_that("extime - messy not included", {
    # Prepare data
    otree2 <- otree_all

    # Run function and test
    testthat::expect_error(
      output <- extime(otree2, combine = FALSE), # Is automatically TRUE
      "using data from different "
    )
  })

  testthat::test_that("extime - messy included", {
    # Prepare data
    otree2 <- otree_all

    # Run function
    output <- extime(otree2, combine = TRUE)  # Is automatically TRUE

    # Test

    # Test if variables exist / don't exist
    test1 <- !is.null(output$mean_duration) & !is.na(output$mean_duration)
    test2 <- !is.null(output$min_duration) & !is.na(output$min_duration)
    test3 <- !is.null(output$max_duration) & !is.na(output$max_duration)
    test4 <- exists("single_durations", output)

    # Test if the values and the single_durations align
    test5 <- round(output$min_duration, 2L) ==
      round(min(output$single_durations$duration), 2L)
    test6 <- round(output$max_duration, 2L) ==
      round(max(output$single_durations$duration), 2L)
    test7 <- round(output$mean_duration, 2L) ==
      round(mean(output$single_durations$duration), 2L)
    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6, test7)))
  })

  testthat::test_that("extime - 3 digits", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function
    output <- extime(otree2, digits = 3L)

    # Test
    test1 <- round(mean(output$single_durations$duration), digits = 3L) ==
      output$mean_duration
    test2 <- round(min(output$single_durations$duration), digits = 3L) ==
      output$min_duration
    test3 <- round(max(output$single_durations$duration), digits = 3L) ==
      output$max_duration
    # Test if the values and the single_durations align
    test5 <- round(output$min_duration, 2L) ==
      round(min(output$single_durations$duration), 2L)
    test6 <- round(output$max_duration, 2L) ==
      round(max(output$single_durations$duration), 2L)
    test7 <- round(output$mean_duration, 2L) ==
      round(mean(output$single_durations$duration), 2L)
    testthat::expect_true(all(c(test1, test2, test3,
                                test5, test6, test7)))
  })

  testthat::test_that("extime - for a specific group", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2 <- make_ids(otree2, gmake = TRUE, from_app = "dictator")

    # Run
    output <- extime(otree2, group_id = 1L)

    # Test
    test1 <- !is.null(output$mean_duration) & !is.na(output$mean_duration)
    test2 <- !is.null(output$min_duration) & !is.na(output$min_duration)
    test3 <- !is.null(output$max_duration) & !is.na(output$max_duration)
    test4 <- exists("single_durations", output)
    testthat::expect_true(all(c(test1, test2, test3, test4)))
  })

  testthat::test_that("extime - experiment just one page", {
    otree2 <- otree_2_2_4

    # Run
    output <- extime(otree2, sinfo = NULL)

    # Test

    # Test if variables exist / don't exist
    test1 <- !is.null(output$mean_duration) & !is.na(output$mean_duration)
    test2 <- !is.null(output$min_duration) & !is.na(output$min_duration)
    test3 <- !is.null(output$max_duration) & !is.na(output$max_duration)
    test4 <- exists("single_durations", output)

    test5 <- grepl(
      pattern = "the experiment only has one page",
      x = output$messages)
    test6 <- is.vector(output$only_one_page)

    # Test if the values and the single_durations align
    test7 <- round(output$min_duration, 2L) ==
      round(min(output$single_durations$duration), 2L)
    test8 <- round(output$max_duration, 2L) ==
      round(max(output$single_durations$duration), 2L)
    test9 <- round(output$mean_duration, 2L) ==
      round(mean(output$single_durations$duration), 2L)
    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6, test7, test8,
                                test9)))
  })

  testthat::test_that("extime - with sinfo session_code", {
    otree2 <- otree_all
    testthat::expect_warning(
      otree2 <- messy_time(otree2, combine = TRUE, info = TRUE),
      "More than one variable referred to")

    # Run function
    output <- extime(otree2, sinfo = "session_code")

    # Test

    # Test if variables exist / don't exist
    test1 <- !is.null(output$mean_duration) & !is.na(output$mean_duration)
    test2 <- !is.null(output$min_duration) & !is.na(output$min_duration)
    test3 <- !is.null(output$max_duration) & !is.na(output$max_duration)
    test4 <- exists("single_durations", output)

    # Test if the values and the single_durations align
    test5 <- round(output$min_duration, 2L) ==
      round(min(output$single_durations$duration), 2L)
    test6 <- round(output$max_duration, 2L) ==
      round(max(output$single_durations$duration), 2L)
    test7 <- round(output$mean_duration, 2L) ==
      round(mean(output$single_durations$duration), 2L)
    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6, test7)))
  })

  testthat::test_that("extime - session_id", {
    # Prepare data
    otree2 <- otree_all
    otree2 <- delete_duplicate(otree2)
    testthat::expect_warning(
      otree2 <- messy_chat(otree2, combine = TRUE, info = TRUE),
      "More than one variable referred to")

    testthat::expect_warning(
      otree2 <- messy_time(otree2, combine = TRUE, info = TRUE),
      "More than one variable referred to")

    otree2 <- make_ids(otree2, pmake = TRUE)

    # Run function
    output <- extime(otree2,
                     combine = TRUE,
                     sinfo = "session_id")

    # Test
    test1 <- is.numeric(output$mean_duration)
    test2 <- is.numeric(output$max_duration)
    test3 <- is.numeric(output$min_duration)
    test4 <- is.numeric(output$single_durations$session)

    # Test if the values and the single_durations align
    test5 <- round(output$min_duration, 2L) ==
      round(min(output$single_durations$duration), 2L)
    test6 <- round(output$max_duration, 2L) ==
      round(max(output$single_durations$duration), 2L)
    test7 <- round(output$mean_duration, 2L) ==
      round(mean(output$single_durations$duration), 2L)

    # Test warnings
    test8 <- !is.null(output$only_one_page)
    test9 <- any(grepl(
      "For at least one participant, the experiment only has one page",
      output$messages))

    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6, test7, test8,
                                test9)))
  })

  testthat::test_that("extime - otree all: no session_id", {
    # Prepare data
    otree2 <- otree_all
    otree2 <- delete_duplicate(otree2)

    # Run function
    output <- extime(otree2,
                     combine = TRUE,
                     sinfo = "session_id")
    # Test
    test1 <- is.numeric(output$single_durations$session)
    testthat::expect_true(test1)
  })

  testthat::test_that("extime - otree all: session_code", {
    # Prepare data
    otree2 <- otree_all
    otree2 <- delete_duplicate(otree2)

    # Run function
    output <- extime(otree2,
                     combine = TRUE,
                     sinfo = "session_code")
    # Test
    test1 <- is.vector(output$single_durations$session)
    testthat::expect_true(test1)

    # Test if the values and the single_durations align
    test5 <- round(output$min_duration, 2L) ==
      round(min(output$single_durations$duration), 2L)
    test6 <- round(output$max_duration, 2L) ==
      round(max(output$single_durations$duration), 2L)
    test7 <- round(output$mean_duration, 2L) ==
      round(mean(output$single_durations$duration), 2L)
    testthat::expect_true(all(c(test5, test6, test7)))
  })

  testthat::test_that("extime - one person only one page", {
    # Prepare data
    otree2 <- otree_2_2_4
    person <- aggregate(otree2$Time,
                        list(person = otree2$Time$participant__code),
                        FUN = "max")
    person <- unlist(person[person$page_index == 1L, ][1L])

    # Run function
    testthat::expect_warning(
      output <- extime(otree2,
                       combine = TRUE,
                       sinfo = NULL,
                       person), "the experiment only has one page")

    # Test
    test1 <- is.na(output)
    testthat::expect_true(test1)
  })

  testthat::test_that("extime - startat real", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function
    output <- extime(otree2,
                     startat = "real",
                     seconds = TRUE,
                     sinfo = NULL)

    # Test
    test1 <- !is.null(output$mean_duration) & !is.na(output$mean_duration)
    test2 <- !is.null(output$min_duration) & !is.na(output$min_duration)
    test3 <- !is.null(output$max_duration) & !is.na(output$max_duration)
    test4 <- exists("single_durations", output)

    # Test if the values and the single_durations align
    test5 <- round(output$min_duration, 2L) ==
      round(min(output$single_durations$duration), 2L)
    test6 <- round(output$max_duration, 2L) ==
      round(max(output$single_durations$duration), 2L)
    test7 <- round(output$mean_duration, 2L) ==
      round(mean(output$single_durations$duration), 2L)
    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6, test7)))
  })

  testthat::test_that("extime - startat comparison - comparison
                      real und 1", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function
    output <- extime(otree2,
                     startat = "real",
                     seconds = TRUE,
                     sinfo = NULL)

    output2 <- extime(otree2,
                      startat = 1L,
                      seconds = TRUE,
                      sinfo = NULL)

    # The difference to startat = 1 is that startat = 1 does
    # not result in decimal numbers.
    # startat = "real" has a more precise start time!!!

    # Test
    test1 <- !is.null(output$mean_duration) & !is.na(output$mean_duration)
    test2 <- !is.null(output$min_duration) & !is.na(output$min_duration)
    test3 <- !is.null(output$max_duration) & !is.na(output$max_duration)
    test4 <- exists("single_durations", output)
    # Test if the values and the single_durations align
    test5 <- round(output$min_duration, 2L) ==
      round(min(output$single_durations$duration), 2L)
    test6 <- round(output$max_duration, 2L) ==
      round(max(output$single_durations$duration), 2L)
    test7 <- round(output$mean_duration, 2L) ==
      round(mean(output$single_durations$duration), 2L)
    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6, test7)))
  })

  testthat::test_that("extime - seconds", {
    otree2 <- otree_5_4_0

    # Run function
    output <- extime(otree2, seconds = TRUE)

    # Test
    test1 <- !is.null(output$mean_duration) & !is.na(output$mean_duration)
    test2 <- !is.null(output$min_duration) & !is.na(output$min_duration)
    test3 <- !is.null(output$max_duration) & !is.na(output$max_duration)
    test4 <- exists("single_durations", output)

    # Test if the values and the single_durations align
    test5 <- round(output$min_duration, 2L) ==
      round(min(output$single_durations$duration), 2L)
    test6 <- round(output$max_duration, 2L) ==
      round(max(output$single_durations$duration), 2L)
    test7 <- round(output$mean_duration, 2L) ==
      round(mean(output$single_durations$duration), 2L)
    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6, test7)))
  })

  testthat::test_that("extime - old otree", {
    # Prepare data
    otree2 <- otree_2_2_4

    # Run function
    output <- extime(otree2, sinfo = NULL)

    # Test
    test1 <- !is.null(output$mean_duration) & !is.na(output$mean_duration)
    test2 <- !is.null(output$min_duration) & !is.na(output$min_duration)
    test3 <- !is.null(output$max_duration) & !is.na(output$max_duration)
    test4 <- exists("single_durations", output)

    # Test if the values and the single_durations align
    test5 <- round(output$min_duration, 2L) ==
      round(min(output$single_durations$duration), 2L)
    test6 <- round(output$max_duration, 2L) ==
      round(max(output$single_durations$duration), 2L)
    test7 <- round(output$mean_duration, 2L) ==
      round(mean(output$single_durations$duration), 2L)
    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6, test7)))
  })

  testthat::test_that("extime - old otree seconds on page", {
    # Prepare data
    otree2 <- otree_2_2_4

    # Run function
    output <- extime(otree2, sinfo = NULL)
    otree2$Time$time_stamp <- NULL
    output2 <- extime(otree2, sinfo = NULL)

    # Test
    test1 <- output$mean_duration == output2$mean_duration
    test2 <- output$min_duration & output2$min_duration
    test3 <- output$min_duration & output2$min_duration
    test4 <- exists("single_durations", output2)

    test6 <- round(mean(output2$single_durations$duration),
                   digits = 2L) == output2$mean_duration

    testthat::expect_true(all(c(test1, test2, test3,
                                test4, test6)))
  })

  testthat::test_that("extime - old otree seconds on page error", {
    # Prepare data
    otree2 <- otree_2_2_4

    # Run function
    otree2$Time$time_stamp <- NULL
    testthat::expect_error(
      extime(otree2,
             startat = "real",
             sinfo = NULL),
      "There is no variable referring to the time stamp"
    )
  })

  testthat::test_that("extime - oTree version 2.2.4", {
    # Prepare data
    otree2 <- otree_2_2_4
    # otree2$Time$session_id # There is already a variable called session_id
    otree2 <- make_ids(otree2)
    # otree2$Time$session_id  # The new session_id looks the same

    # Run function
    output <- extime(otree2, sinfo = "session_id")

    # Test
    test1 <- !is.null(output$mean_duration) & !is.na(output$mean_duration)
    test2 <- !is.null(output$min_duration) & !is.na(output$min_duration)
    test3 <- !is.null(output$max_duration) & !is.na(output$max_duration)
    test4 <- exists("single_durations", output)
    # Test if the values and the single_durations align
    test5 <- round(output$min_duration, 2L) ==
      round(min(output$single_durations$duration), 2L)
    test6 <- round(output$max_duration, 2L) ==
      round(max(output$single_durations$duration), 2L)
    test7 <- round(output$mean_duration, 2L) ==
      round(mean(output$single_durations$duration), 2L)
    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6, test7)))
  })

  testthat::test_that("extime - old specific", {
    # Prepare data
    otree2 <- otree_2_2_4
    person <- otree2$all_apps_wide$participant.code[1L]

    # Run function
    output <- extime(otree2,
                     pcode = person,
                     sinfo = NULL)

    # Test
    test <- !is.null(output) & !is.na(output)
    testthat::expect_true(test)
  })

  testthat::test_that("extime - old startatreal without session info", {
    # Prepare data
    otree2 <- otree_2_2_4
    otree2 <- make_ids(otree2, gmake = TRUE, from_app = "dictator")

    # Run function
    output <- extime(otree2, startat = "real", sinfo = NULL)

    # Test
    testthat::expect_output(str(output), "List of 6")

    # Test if the values and the single_durations align
    test5 <- round(output$min_duration, 2L) ==
      round(min(output$single_durations$duration), 2L)
    test6 <- round(output$max_duration, 2L) ==
      round(max(output$single_durations$duration), 2L)
    test7 <- round(output$mean_duration, 2L) ==
      round(mean(output$single_durations$duration), 2L)
    testthat::expect_true(all(c(test5, test6, test7)))
  })

  testthat::test_that("extime - old startatreal with session info", {
    # Prepare data
    otree2 <- otree_2_2_4
    otree2 <- make_ids(otree2, gmake = TRUE, from_app = "dictator")

    # Run function and test
    # If sinfo is not NULL, there will be an error in some of the old oTree
    # versions because they don't save the session_code there
    testthat::expect_error(
      output <- extime(otree2, startat = "real", sinfo = "session_code"),
      "There is no variable called session_code or session__code")
  })

  testthat::test_that("extime - for a specific individual - code", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2 <- make_ids(otree2, gmake = TRUE, from_app = "dictator")
    person <- otree2$all_apps_wide$participant.code[1L]

    # Run function
    output <- extime(otree2, person)

    # Test
    # Last entry for the person
    max <- max(otree2$Time$epoch_time_completed[
      otree2$Time$participant_code == person])

    # First entry for the person
    min <- min(otree2$Time$epoch_time_completed[
      otree2$Time$participant_code == person])

    # Duration
    duration <- max - min
    duration <- duration / 60L
    testthat::expect_identical(output, round(duration, 2L))
  })

  testthat::test_that("extime - for a specific individual - label", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Make unique participant labels
    otree2$all_apps_wide$participant.label <-
      sapply(seq_along(otree2$all_apps_wide$participant.label),
             function(x) paste("Person ", x))

    person <- otree2$all_apps_wide$participant.label[1L]

    # Run function
    output <- extime(otree2,
                     plabel = person,
                     sinfo = NULL)

    pcode <- otree2$all_apps_wide$participant.code[
      otree2$all_apps_wide$participant.label == person]

    # Test
    max <- max(otree2$Time$epoch_time_completed[
      otree2$Time$participant_code == pcode])

    min <- min(otree2$Time$epoch_time_completed[
      otree2$Time$participant_code == pcode])

    duration <- max - min
    duration <- duration / 60L
    testthat::expect_identical(output, round(duration, 2L))
  })

  testthat::test_that("extime - for a specific individual (real)", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2 <- make_ids(otree2, gmake = TRUE, from_app = "dictator")
    person1 <- unique(otree2$Time$participant_code)[1L]

    # Run function
    output <- extime(otree2, person1, startat = "real")

    # Test
    max <- max(otree2$Time$epoch_time_completed[
      otree2$Time$participant_code == person1])
    min <- (as.numeric(
      as.POSIXct(otree2$all_apps_wide$participant.time_started[
        otree2$all_apps_wide$participant.code == person1], tz = "UTC")))

    duration <- max - min
    duration <- duration / 60L
    testthat::expect_identical(output, round(duration, 2L))
  })

  testthat::test_that("extime - old specific, warning not enough entries", {
    # Prepare data (get a person with only one index entry)
    otree2 <- otree_2_2_4
    person <- aggregate(otree2$Time,
                        list(person = otree2$Time$participant__code),
                        FUN = "max")
    person <- unlist(person[person$page_index == 1L, ][1L])

    # Run function and test
    testthat::expect_warning(
      output <- extime(otree2,
                       pcode = person,
                       sinfo = NULL),
      "the experiment only has one page")

    test1 <- is.na(output)
    testthat::expect_true(test1)
  })

  testthat::test_that("extime - old specific, startat", {
    # Prepare data
    otree2 <- otree_2_2_4
    person <- otree2$all_apps_wide$participant.code[1L]

    # Run function
    output <- extime(otree2,
                     pcode = person,
                     sinfo = NULL,
                     startat = "real")

    # Test
    test <- !is.null(output) & !is.na(output)
    testthat::expect_true(test)
  })

  testthat::test_that("extime - old startatreal", {
    # Prepare data
    otree2 <- otree_2_2_4

    # Run function
    output <- extime(otree2, startat = "real", sinfo = NULL)

    # Test
    testthat::expect_output(str(output), "List of 6")
    test1 <- is.numeric(output$mean_duration)
    test2 <- is.numeric(output$max_duration)
    test3 <- is.numeric(output$min_duration)
    test4 <- !is.null(output$single_durations)
    test5 <- is.null(output$single_durations$session)
    test6 <- !is.null(output$messages)
    test7 <- !is.null(output$only_one_page)
    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6, test7)))

    # Test if the values and the single_durations align
    test5 <- round(output$min_duration, 2L) ==
      round(min(output$single_durations$duration), 2L)
    test6 <- round(output$max_duration, 2L) ==
      round(max(output$single_durations$duration), 2L)
    test7 <- round(output$mean_duration, 2L) ==
      round(mean(output$single_durations$duration), 2L)
    testthat::expect_true(all(c(test5, test6, test7)))
  })

  testthat::test_that("extime - old startat and 0 comparison", {
    # Prepare data
    otree2 <- otree_5_4_0
    person <- otree2$all_apps_wide$participant.code[1L]

    # Run function
    startattime_real <- extime(otree2,
                               startat = "real",
                               seconds = TRUE,
                               digits = 5L,
                               sinfo = NULL)
    startattime_0 <- extime(otree2,
                            startat = 1L,
                            seconds = TRUE,
                            digits = 5L,
                            sinfo = NULL)

    # Test
    val_real <- otree2$all_apps_wide$participant.time_started_utc[
      otree2$all_apps_wide$participant.code == person]

    # Delete last part of val_real (more detailed time than val0)
    # val0 only seconds
    val_real <- stringr::str_remove(val_real, ".[0-9]{6}")

    val0 <- otree2$Time$epoch_time_completed[
      otree2$Time$participant_code == person &
        otree2$Time$page_index == 0L]

    val0 <- as.POSIXct(val0, tz = "UTC", origin = "1970-01-01")
    # Remove UTC
    val0 <- stringr::str_remove(val0, " UTC")
    test1 <- val_real == val0
    testthat::expect_true(test1)
  })

  testthat::test_that("extime (w) - warning only
                      one page for old specific", {
    # Prepare data
    otree2 <- otree_2_2_4
    person <- aggregate(otree2$Time,
                        list(person = otree2$Time$participant__code),
                        FUN = "max")
    person <- unlist(person[person$page_index == 1L, ][1L])

    # Run function and test
    testthat::expect_warning(
      output <- extime(otree2,
                       pcode = person,
                       sinfo = NULL),
      "the experiment only has one page")
    test <- is.na(output)
    testthat::expect_true(test)
  })

  testthat::test_that("extime (e) - plabel and group_id", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(
      extime(otree2,
             plabel = "Person 1",
             group_id = 1L,
             sinfo = NULL),
      "Please enter only plabel or group_id")
  })

  testthat::test_that("extime (e) - plabel and pcode", {
    # Prepare data
    otree2 <- otree_5_4_0
    person <- otree2$all_apps_wide$participant.code[1L]

    # Run function and test
    testthat::expect_error(
      extime(otree2,
             plabel = "Person 1",
             pcode = person,
             sinfo = NULL),
      "Please enter only pcode or plabel")
  })

  testthat::test_that("extime (e) - several plabels in argument", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(
      extime(otree2,
             plabel = c("Person 1", "Person 2"),
             sinfo = NULL),
      "Please enter only one participant label")
  })

  testthat::test_that("extime (e) - several plabels in data", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$all_apps_wide$participant.label <-
      rep("Person1", "Person2", length(otree2$all_apps_wide$participant.label))

    # Run function and test
    testthat::expect_error(
      extime(otree2,
             plabel = c("Person 1"),
             sinfo = NULL),
     paste0("You do not have unique participant labels in your ",
     "all_apps_wide data frame!"))
  })

  testthat::test_that("extime (e) - plabel but no aaw", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$all_apps_wide <- NULL

    # Run function and test
    testthat::expect_error(
      extime(otree2,
             plabel = "Person 1",
             sinfo = NULL),
      "if there is an all_apps_wide-data frame")
  })

  testthat::test_that("extime (e) - old specific: TIME empty", {
    # Prepare data (delete everything from time)
    otree2 <- otree_2_2_4
    otree2$Time <- otree2$Time[NULL, ]

    # Run function and test
    testthat::expect_error(extime(otree2,
                                  sinfo = NULL),
                           "data frame is empty")
  })

  testthat::test_that("extime (e) - old specific: TIME for one empty", {
    # Prepare data
    otree2 <- otree_2_2_4
    person <- otree2$all_apps_wide$participant.code[2L]
    otree2$Time <- otree2$Time[otree2$Time$participant__code != person, ]

    # Run function and test
    testthat::expect_error(extime(otree2,
                                  pcode = person,
                                  sinfo = NULL),
                           "The participant is not in the")
  })

  testthat::test_that("extime (e) - starting value old specific", {
    # Prepare data
    otree2 <- otree_2_2_4
    person <- otree2$all_apps_wide$participant.code[2L]

    # Run function and test
    testthat::expect_error(
      extime(otree2,
             pcode = person,
             sinfo = NULL,
             startat = 20L),
      "The chosen starting value startat is higher than the total")
  })

  testthat::test_that("extime (e) - startat specific - old", {
    # Prepare data
    otree2 <- otree_2_2_4
    person <- otree2$all_apps_wide$participant.code[1L]

    # Run function and test
    testthat::expect_error(
      extime(otree2,
             startat = 400L,
             pcode = person,
             sinfo = NULL),
      "The chosen starting value startat is higher than the total number")
  })

  testthat::test_that("extime (e) - startat: old", {
    # Prepare data
    otree2 <- otree_2_2_4

    # Run function and test
    testthat::expect_error(
      extime(otree2,
             startat = 400L,
             sinfo = NULL),
      "The chosen starting value startat is higher than the total number")
  })

  testthat::test_that("extime (e) - startat: new", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(
      extime(otree2,
             startat = 400L,
             sinfo = NULL),
      "The chosen starting value startat is higher than the total number")
  })

  testthat::test_that("extime (e) - startat: new specific", {
    # Prepare data
    otree2 <- otree_5_4_0
    person <- otree2$all_apps_wide$participant.code[1L]

    # Run function and test
    testthat::expect_error(
      extime(otree2,
             pcode = person,
             startat = 400L,
             sinfo = NULL),
      "The chosen starting value startat is higher than the total number")
  })

  testthat::test_that("extime (e) - startat: old specific", {
    # Prepare data
    otree2 <- otree_2_2_4
    otree2 <- delete_duplicate(otree2)
    person <- otree2$all_apps_wide$participant.code[1L]

    # Run function and test
    testthat::expect_error(
      extime(otree2,
             pcode = person,
             startat = 400L,
             sinfo = NULL),
      "The chosen starting value startat is higher than the total number")
  })

  testthat::test_that("extime (e) - startat: new too low", {
    # Prepare data
    otree2 <- otree_2_2_4
    otree2$Time <- otree2$Time[otree2$Time$page_index > 2L, ]

    # Run function and test
    testthat::expect_error(
      extime(otree2,
             startat = 1L,
             sinfo = NULL),
      "is lower than")
  })

  testthat::test_that("extime (e) - startat: new too low", {
    # Prepare data
    otree2 <- otree_2_2_4
    otree2$Time <- otree2$Time[otree2$Time$page_index > 2L, ]
    person <- otree2$Time$participant__code[otree2$Time$page_index > 5L][1L]

    # Run function and test
    testthat::expect_error(
      extime(otree2,
             pcode = person,
             startat = 1L,
             sinfo = NULL),
      "is lower than")
  })

  testthat::test_that("extime (e) - startat real and no aaw", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$all_apps_wide <- NULL

    # Run function and test
    testthat::expect_error(extime(otree2,
                                  startat = "real",
                                  sinfo = NULL),
                           "only works if there is a")
  })

  testthat::test_that("extime (e) - nonexistent specific individual ", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(extime(otree2,
                                  "fake_individual"),
                           "The participant is not in the")
  })

  testthat::test_that("extime (e) - individual + group specified", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(extime(otree2,
                                  pcode = "3ttf7yix",
                                  group_id = 1L),
                           "specify either the pcode or the group_id")
  })

  testthat::test_that("extime (e) - variable group_id not there", {
    # Run function and test
    otree2 <- otree_5_4_0

    # Run function and test error if group_id is not defined yet
    testthat::expect_error(extime(otree2, group_id = 7L))
  })

  testthat::test_that("extime (e) - this group_id not there", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2 <- make_ids(otree2, gmake = TRUE, from_app = "dictator")

    # Run function and test error if chosen group_id is not in data frame
    testthat::expect_error(extime(otree2, group_id = 47L))
  })

  testthat::test_that("extime (e) - no session_code", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$Time$session_code <- NULL

    # Run function and test error if chosen group_id is not in data frame
    testthat::expect_error(extime(otree2),
                           "no variable called session_code")
  })

  testthat::test_that("extime (e) - valid session info", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(extime(otree2,
                                  sinfo = "any"),
                           "Please specify a valid sinfo")
  })

  testthat::test_that("extime (e) - no session id", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$Time$session_id <- NULL

    # Run function and test
    testthat::expect_error(extime(otree2,
                                  sinfo = "session_id"),
                           "There is no session_id in the")
  })

  testthat::test_that("extime (e) - only one participant", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(
      extime(otree2,
             pcode = c("164r1hs4", "7wa8kk3d")),
      "Please enter only one participant")
  })

  testthat::test_that("extime (e) - no Time data frame", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$Time <- NULL

    # Run function and test
    testthat::expect_error(extime(otree2),
                           "There is no \"Time\" data frame")
  })

  testthat::test_that("extime (e) - participant not there", {
    # Prepare data
    otree2 <- otree_all

    # Run function and test
    testthat::expect_error(
      extime(otree2,
             sinfo = "session_id",
             combine = TRUE,
             pcode = "wrongcode"), "The participant is not in the ")
  })

  testthat::test_that("extime (e) - messy data", {
    # Prepare data
    otree2 <- otree_all

    # Run function and test error
    testthat::expect_error(
      extime(otree2,
             sinfo = "session_id",
             combine = FALSE),
      "It seems as if you are using data from different oTree versions")
  })

  testthat::test_that("extime (e) - starting value", {
    # Prepare data
    otree2 <- otree_all
    namesbefore <- names(otree2$Time)

    # Run function
    testthat::expect_error(extime(otree2,
                                  combine = TRUE,
                                  startat = 400L),
                           "The chosen starting value startat")

    # Test
    namesafter <- names(otree2$Time)
    test1 <- length(namesbefore) == length(namesafter) # of course
    testthat::expect_true(test1)
  })

  testthat::test_that("extime (e) - otree new - no session_id", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2 <- delete_duplicate(otree2)

    # Run function
    testthat::expect_error(
      extime(otree2,
             combine = TRUE,
             sinfo = "session_id"),
      "no session_id in the")
  })

  testthat::test_that("extime (e) - no time stamp", {
    otree2 <- otree_5_4_0
    otree2$Time$epoch_time_completed <- NULL
    testthat::expect_error(extime(otree2),
                           "There is no variable")
  })

  testthat::test_that("extime (e) - no valid starttime", {
    otree2 <- otree_5_4_0
    testthat::expect_error(extime(otree2,
                                  startat = -3L),
                           "Please choose a valid")
  })

  testthat::test_that("extime (e) - no participant var", {
    otree2 <- otree_5_4_0
    otree2$Time$participant_code <- NULL
    testthat::expect_error(extime(otree2),
                           "There is no variable")
  })

  print("---- apptime -----")

  print("---- pagesec -----")
  # Page seconds   ####
  testthat::test_that("pagesec", {
    # Run function
    # Make minutes
    otree2 <- pagesec(otree_5_4_0, minutes = TRUE)
    # Make seconds
    otree2 <- pagesec(otree2, minutes = FALSE)

    # Test
    test1 <- mean(otree2$Time$minutes_on_page,
                  na.rm = TRUE) > 0L

    test2 <- mean(otree2$Time$seconds_on_page2,
                  na.rm = TRUE) > 0L

    test3 <- testthat::expect_identical(
      otree2$Time$minutes_on_page[!is.na(otree2$Time$minutes_on_page)],
      round(otree2$Time$seconds_on_page2[
        !is.na(otree2$Time$seconds_on_page2)] / 60L, 2L))

    testthat::expect_true(all(c(test1, test2)))

    # Test if nothing is deleted from custom export
    testthat::expect_true(nrow(otree2$custexp_dictator) == 8L)

  })

  testthat::test_that("pagesec - minutes ", {
    # Run function
    otree2 <- pagesec(otree_5_4_0, minutes = TRUE)
    otree2 <- pagesec(otree2, minutes = FALSE)

    # Test
    variable <- otree2$Time$seconds_on_page2

    test1 <- testthat::expect_true(
      mean(variable, na.rm = TRUE) > 0.0
    )

    testthat::expect_identical(
      otree2$Time$minutes_on_page[!is.na(otree2$Time$minutes_on_page)],
      round(otree2$Time$seconds_on_page2[
        !is.na(otree2$Time$seconds_on_page2)] / 60L, 2L))

    # Test if nothing is deleted from custom export
    testthat::expect_true(nrow(otree2$custexp_dictator) == 8L)

  })

  testthat::test_that("pagesec - oTree 2.2.4", {
    # Prepare data
    otree2 <- otree_2_2_4

    # Run function
    otree2 <- pagesec(otree2)

    # Test
    testthat::expect_false(is.null(otree2$Time$seconds_on_page2))

    test1 <- all(otree2$Time$seconds_on_page2[
      !is.na(otree2$Time$seconds_on_page2)] ==
        otree2$Time$seconds_on_page[!is.na(otree2$Time$seconds_on_page2)])

    testthat::expect_true(test1)
  })

  testthat::test_that("pagesec - messy time", {
    # Prepare data
    otree2 <- otree_all

    # Run function
    testthat::expect_warning(
      otree2 <- pagesec(otree2,
                        minutes = TRUE,
                        combine = TRUE),
      "referred to ")

    otree2 <- pagesec(otree2,
                      minutes = FALSE)

    # Test
    test1 <- mean(otree2$Time$minutes_on_page,
                  na.rm = TRUE) > 0.0

    test2 <- mean(otree2$Time$seconds_on_page2,
                  na.rm = TRUE) > 0.0
    test3 <- all(
      otree2$Time$seconds_on_page2[!is.na(otree2$Time$seconds_on_page2) &
                                     !is.na(otree2$Time$seconds_on_page)] ==
        otree2$Time$seconds_on_page[!is.na(otree2$Time$seconds_on_page2) &
                                      !is.na(otree2$Time$seconds_on_page)])

    test4 <- testthat::expect_identical(
      otree2$Time$minutes_on_page[!is.na(otree2$Time$minutes_on_page)],
      round(otree2$Time$seconds_on_page2[
        !is.na(otree2$Time$seconds_on_page2)] / 60L, 2L))

    testthat::expect_true(all(c(test1, test2, test3)))

    # Test if nothing is deleted from custom export
    testthat::expect_true(nrow(otree2$custexp_dictator) %% 8L == 0L)

  })

  testthat::test_that("pagesec (e) - messy time", {
    # Prepare data
    otree2 <- otree_all

    # Run function and test
    testthat::expect_error(
      pagesec(otree2,
              minutes = TRUE),
      "referred to the time stamp.*referred to the participant code")
  })

  testthat::test_that("pagesec (e) - no epoch time", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$Time$epoch_time_completed <- NULL

    # Run function and test
    testthat::expect_error(
      pagesec(otree2, minutes = TRUE),
      "no variable referring to the time stamp")
  })

  testthat::test_that("pagesec (e) - no participant code", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$Time$participant_code <- NULL

    # Run function and test
    testthat::expect_error(
      pagesec(otree2, minutes = TRUE),
      "no variable referring to the participant")
  })

  testthat::test_that("pagesec (e) - no Time files", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$Time <- NULL

    # Run function and test
    testthat::expect_error(pagesec(otree2), "No Time data frame")
  })

  print("---- show_constant -----")

  # Show constant  ####
  testthat::test_that("Show constant - empty ", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function
    output <- show_constant(otree2, value = "donotfind")

    # Test
    test1 <- "all_apps_wide" %in% names(output)
    test2 <- "chatapp" %in% names(output)
    test3 <- "dictator" %in% names(output)
    test4 <- "start" %in% names(output)
    test5 <- "survey" %in% names(output)
    test6 <- "Time" %in% names(output)
    test7 <- "Chats" %in% names(output)
    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6, test7)))

    test1 <- length(output$all_apps_wide) == 0L
    test2 <- length(output$chatapp) == 0L
    test3 <- length(output$dictator) == 0L
    test4 <- length(output$start) == 0L
    test5 <- length(output$survey) == 0L
    test6 <- length(output$Time) == 0L
    test7 <- length(output$Chats) == 0L
    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6, test7)))
  })

  testthat::test_that("Show constant - NA ", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function
    output <- show_constant(otree2, value = NA)

    # Test
    test1 <- "all_apps_wide" %in% names(output)
    test2 <- "chatapp" %in% names(output)
    test3 <- "dictator" %in% names(output)
    test4 <- "start" %in% names(output)
    test5 <- "survey" %in% names(output)
    test6 <- "Time" %in% names(output)
    test7 <- "Chats" %in% names(output)
    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6, test7)))
  })

  testthat::test_that("Show constant - any", {
    # Run function
    output <- show_constant(otree_5_4_0, value = "any")

    # Test
    test1 <- "all_apps_wide" %in% names(output)
    test2 <- "chatapp" %in% names(output)
    test3 <- "dictator" %in% names(output)
    test4 <- "start" %in% names(output)
    test5 <- "survey" %in% names(output)
    test6 <- "Time" %in% names(output)
    test7 <- "Chats" %in% names(output)
    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6, test7)))
  })

  testthat::test_that("Show constant - -99", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$all_apps_wide$constant_col <- -99L # Make fake column

    # Run function
    output <- show_constant(otree2, value = -99L)

    # Test
    test1 <- "all_apps_wide" %in% names(output)
    test2 <- "chatapp" %in% names(output)
    test3 <- "dictator" %in% names(output)
    test4 <- "start" %in% names(output)
    test5 <- "survey" %in% names(output)
    test6 <- "Time" %in% names(output)
    test7 <- "Chats" %in% names(output)
    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6, test7)))

    test1 <- length(output$all_apps_wide) == 1L
    test2 <- length(output$chatapp) == 0L
    test3 <- length(output$dictator) == 0L
    test4 <- length(output$start) == 0L
    test5 <- length(output$survey) == 0L
    test6 <- length(output$Time) == 0L
    test7 <- length(output$Chats) == 0L
    testthat::expect_true(all(c(test1, test2, test3, test4,
                                test5, test6, test7)))
  })

  testthat::test_that("Show constant (e) - only one value", {
    # Run function and test
    testthat::expect_error(show_constant(otree_5_4_0,
                                         c(-99L, NA)),
                           "Please only enter only one value")
  })

  testthat::test_that("Show constant (e) - valid value", {
    # Run function and test
    testthat::expect_error(show_constant(otree_5_4_0,
                                         NULL),
                           "Please enter a valid value!")
  })

  print("---- assignv -----")

  # Assign variable  ####
  testthat::test_that("Assign variable - new", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function
    otree2 <- assignv(oTree = otree2,
                      variable = "survey.1.player.gender",
                      newvar = "gender")
    # Test
    testthat::expect_vector(otree2$survey$gender)

    # Test if nothing is deleted from custom export
    testthat::expect_true(nrow(otree2$custexp_dictator) == 8L)
  })

  testthat::test_that("Assign variable - new, one random df", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$random_dataframe <- data.frame(
      a = c(1L, 2L, 3L),
      b = c(4L, 5L, 6L),
      c = c(7L, 8L, 9L))

    # Run function
    otree2 <- assignv(oTree = otree2,
                      variable = "survey.1.player.gender",
                      newvar = "gender")
    # Test
    testthat::expect_vector(otree2$survey$gender)
    testthat::expect_null(otree2$random_dataframe$gender)

    # Test if nothing is deleted from custom export
    testthat::expect_true(nrow(otree2$custexp_dictator) == 8L)
  })

  testthat::test_that("Assign variable - old", {
    # Prepare data
    otree2 <- otree_2_2_4

    # Run function
    otree2 <- assignv(oTree = otree2,
                      variable = "survey.1.player.gender",
                      newvar = "gender")
    # Test
    testthat::expect_vector(otree2$survey$gender)
  })

  testthat::test_that("Assign variable - res after", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$survey$younger30 <- as.integer(otree2$survey$player.age < 30L)

    # Run function
    otree2 <- assignv_to_aaw(otree2,
                             app = "survey",
                             variable = "younger30",
                             newvar = "younger30",
                             resafter = "survey.1.player.age")

    # Test
    diff <- match("younger30", names(otree2$all_apps_wide)) -
      match("survey.1.player.age", names(otree2$all_apps_wide))
    testthat::expect_identical(diff, 1L)

    # Test if nothing is deleted from custom export
    testthat::expect_true(nrow(otree2$custexp_dictator) == 8L)
  })

  testthat::test_that("Assign variable (e) - no aaw", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$all_apps_wide <- NULL

    # Run function and test
    testthat::expect_error(assignv(oTree = otree2,
                                   variable = "survey.1.player.gender",
                                   newvar = "gender"),
                           "There is no \"all_apps_wi")
  })

  testthat::test_that("Assign variable (e) - too many vars", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(
      assignv(oTree = otree2,
              variable = c("survey.1.player.gender", "asdfasfd"),
              newvar = "gender"), "Please enter only one variable name")
  })

  testthat::test_that("Assign variable (e) - too many vars", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(
      assignv(oTree = otree2,
              variable = c("survey.1.player.gender", "somevar"),
              newvar = c("gender", "somenewvar")),
      "Please enter only one variable name")
  })

  testthat::test_that("Assign variable (e) - too many newvars", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(
      assignv(oTree = otree2,
              variable = "somevar",
              newvar = c("gender", "somenewvar")),
      "Please enter only one new variable name")
  })

  testthat::test_that("Assign variable (e) - aaw not there", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$survey$younger30 <- as.integer(otree2$survey$player.age < 30L)
    otree2$all_apps_wide <- NULL

    # Run function
    testthat::expect_error(
      otree2 <- assignv_to_aaw(otree2,
                               app = "survey",
                               variable = "younger30",
                               newvar = "younger30",
                               resafter = "survey.1.player.age"),
      "There is no")
  })

  testthat::test_that("Assign variable (e) - nonexistent variable", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(
      assignv(oTree = otree2,
              variable = "fake_variable",
              newvar = "gender"),
      "The variable does not exist")
  })

  print("---- assign to AAW ----")

  # Assign to AAW  ####
  testthat::test_that("Assign variable to aaw", {
    # Prepare data
    otree2 <- otree_5_4_0

    otree2$survey$younger30 <- as.integer(otree2$survey$player.age < 30L)

    # Run function
    otree2 <- assignv_to_aaw(otree2,
                             app = "survey",
                             variable = "younger30",
                             newvar = "younger30")

    # Test
    testthat::expect_vector(otree2$all_apps_wide$younger30)

    # Test if nothing is deleted from custom export
    testthat::expect_true(nrow(otree2$custexp_dictator) == 8L)
  })

  testthat::test_that("Assign variable to aaw - random df", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$random_dataframe <- data.frame(
      a = c(1L, 2L, 3L),
      b = c(4L, 5L, 6L),
      c = c(7L, 8L, 9L))

    # Run function
    testthat::expect_error(
      otree2 <- assignv_to_aaw(otree2,
                               app = "random_dataframe",
                               variable = "a",
                               newvar = "a"),
      "This function does not work with random_dataframe"
    )
  })

  testthat::test_that("Assign variable to aaw - one person missing", {
    # Prepare data
    otree2 <- otree_5_4_0
    # Make sure the first player has a value
    otree2$survey$player.age[1L] <- 15L
    person <- otree2$survey$participant.code[1L]
    otree2$survey$younger30 <- as.integer(otree2$survey$player.age < 30L)
    otree2$survey <- otree2$survey[3L:nrow(otree2$survey), ]

    # Run function
    testthat::expect_warning(
      otree2 <- assignv_to_aaw(otree2,
                               app = "survey",
                               variable = "younger30",
                               newvar = "younger30"),
      "However, there is an unequal number of participants")

    # Test
    testthat::expect_vector(otree2$all_apps_wide$younger30)
    testthat::expect_true(is.na(otree2$all_apps_wide$younger30[
      otree2$all_apps_wide$participant.code == person
    ]))

    # Test if nothing is deleted from custom export
    testthat::expect_true(nrow(otree2$custexp_dictator) == 8L)
  })

  testthat::test_that("Assign variable to aaw - all NA", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$survey$younger30 <- NA

    # Run function
    otree2 <- assignv_to_aaw(otree2,
                             app = "survey",
                             variable = "younger30",
                             newvar = "younger30")

    # Test
    testthat::expect_vector(otree2$all_apps_wide$younger30)
    testthat::expect_true(all(is.na(otree2$all_apps_wide$younger30)))
  })

  testthat::test_that("Assign variable to aaw (w)", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Create new variable (delete first row)
    person <- otree2$survey$participant.code[1L]
    otree2$survey <- otree2$survey[2L:nrow(otree2$survey), ]
    otree2$survey$younger30 <- as.integer(otree2$survey$player.age < 30L)

    # Run function
    testthat::expect_warning(
      otree2 <- assignv_to_aaw(otree2,
                               app = "survey",
                               variable = "younger30",
                               newvar = "younger30"),
      "unequal number of")

    # Test
    testthat::expect_vector(otree2$all_apps_wide$younger30)
    test1 <- is.na(otree2$all_apps_wide$younger30[
      otree2$all_apps_wide$participant.code == person])
    testthat::expect_true(test1)
  })

  testthat::test_that("Assign variable to aaw (e) - no aaw", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$survey$younger30 <- as.integer(otree2$survey$player.age < 30L)
    otree2$all_apps_wide <- NULL

    # Run function and test
    testthat::expect_error(assignv_to_aaw(otree2,
                                          app = "survey",
                                          variable = "younger30",
                                          newvar = "younger30"),
                           "There is no \"all_apps_wide\" in your list")
  })

  testthat::test_that("Assign variable to aaw (e) - only one var", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$survey$younger30 <- as.integer(otree2$survey$player.age < 30L)

    # Run function and test
    testthat::expect_error(
      assignv_to_aaw(otree2,
                    app = "survey",
                    variable = c("younger30", "wrongvarname"),
                    newvar = "younger30"),
     "Please enter only one variable name!")
  })

  testthat::test_that("Assign variable to aaw (e) -
                      only one var and newvar", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$survey$younger30 <- as.integer(otree2$survey$player.age < 30L)

    # Run function and test
    testthat::expect_error(
      assignv_to_aaw(otree2,
                    app = "survey",
                    variable = c("younger30", "wrongvarname"),
                    newvar = c("younger30", "wrongnewname")),
     "Please enter only one variable name!")
  })

  testthat::test_that("Assign variable to aaw (e) - only one newvar", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$survey$younger30 <- as.integer(otree2$survey$player.age < 30L)

    # Run function and test
    testthat::expect_error(
      assignv_to_aaw(otree2,
                     app = "survey",
                     variable = "younger30",
                     newvar = c("younger30", "toomanynames")),
     "Please enter only one new variable name!")
  })

  testthat::test_that("Assign variable to aaw (e) - nonexistent variable", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(assignv_to_aaw(otree2,
                                          app = "survey",
                                          variable = "fake_variable",
                                          newvar = "younger30"
    ), "The variable does not exist in the app")
  })

  testthat::test_that("Assign variable to aaw (e) - Chats", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function and test
    testthat::expect_error(assignv_to_aaw(otree2,
                                          app = "Chats",
                                          variable = "nickname",
                                          newvar = "nickname"),
                           "This function does not work with Chats")
  })

  print("---- delete_plabels ----")

  # Delete participant labels   ####
  testthat::test_that("Delete participant labels", {
    # Prepare data
    otree2 <- otree_5_4_0

    # Run function
    otree2 <- delete_plabels(otree2)

    # Test
    testthat::expect_null(otree2$all_apps_wide$participant.label)
    testthat::expect_null(otree2$Time$participant_label)
    testthat::expect_null(otree2$Time$participant__label)
    testthat::expect_null(otree2$Chats$participant_label)
    testthat::expect_null(otree2$Chats$participant__label)
    testthat::expect_null(otree2$dictator$participant.label)
    testthat::expect_null(otree2$survey$participant.label)

    # Check if nothing is deleted from custom export
    testthat::expect_true("custexp_dictator" %in% names(otree2))
    testthat::expect_true(nrow(otree2$custexp_dictator) == 8L)
  })

  testthat::test_that("Delete participant labels - random df", {
    # Prepare data
    otree2 <- otree_5_4_0
    otree2$random_dataframe <- data.frame(
      a = c(1L, 2L, 3L),
      b = c(4L, 5L, 6L),
      c = c(7L, 8L, 9L))

    # Run function
    otree2 <- delete_plabels(otree2)

    # Test
    testthat::expect_null(otree2$all_apps_wide$participant.label)
    testthat::expect_null(otree2$Time$participant_label)
    testthat::expect_null(otree2$Time$participant__label)
    testthat::expect_null(otree2$Chats$participant_label)
    testthat::expect_null(otree2$Chats$participant__label)
    testthat::expect_null(otree2$dictator$participant.label)
    testthat::expect_null(otree2$survey$participant.label)

    # Check if nothing is deleted from custom export
    testthat::expect_true("custexp_dictator" %in% names(otree2))
    testthat::expect_true(nrow(otree2$custexp_dictator) == 8L)
  })

  # Custom export  ####
  testthat::test_that("Import - custom export", {
    otree2 <- import_otree(
      path = testthat::test_path("testdata", "exp_cust_data_rename"),
      info = TRUE,
      del_empty = FALSE
    )

    # Test if nothing is deleted from custom export
    testthat::expect_true(length(names(otree2)) == 4L)
    testthat::expect_true(nrow(otree2$custexp_dictator) == 8L)
  })

}

Try the gmoTree package in your browser

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

gmoTree documentation built on April 3, 2025, 10:26 p.m.