tar_test("keras and clustermq with main storage and retrieval", {
  # Requires Python TensorFlow and Keras.
  # Cannot test inside the RStudio IDE.
  skip_on_os("windows")
  skip_if_not_installed("clustermq")
  skip_if_not_installed("keras")
  tar_runtime$fun <- "tar_make_clustermq"
  on.exit(tar_runtime$fun <- NULL)
  tar_script({
    tar_option_set(packages = "keras")
    options(clustermq.scheduler = "multiprocess")
    f <- function() {
      model <- keras::keras_model_sequential() %>%
        keras::layer_conv_2d(
          filters = 32,
          kernel_size = c(3, 3),
          activation = "relu",
          input_shape = c(28, 28, 1)
        ) %>%
        keras::layer_conv_2d(
          filters = 64,
          kernel_size = c(3, 3),
          activation = "relu"
        ) %>%
        keras::layer_max_pooling_2d(pool_size = c(2, 2)) %>%
        keras::layer_dropout(rate = 0.25) %>%
        keras::layer_flatten() %>%
        keras::layer_dense(units = 128, activation = "relu") %>%
        keras::layer_dropout(rate = 0.5) %>%
        keras::layer_dense(units = 10, activation = "softmax")
      keras::compile(
        model,
        loss = "categorical_crossentropy",
        optimizer = keras::optimizer_adadelta(),
        metrics = "accuracy"
      )
      model
    }
    list(
      tar_target_raw(
        name = "abc",
        command = quote(f()),
        format = "keras"
      )
    )
  })
  tar_make_clustermq()
  expect_true(inherits(tar_read(abc), "keras.engine.training.Model"))
})

tar_test("keras and clustermq with worker storage and retrieval", {
  # Requires Python TensorFlow and Keras.
  # Cannot test inside the RStudio IDE.
  skip_on_os("windows")
  skip_if_not_installed("clustermq")
  skip_if_not_installed("keras")
  tar_runtime$fun <- "tar_make_clustermq"
  on.exit(tar_runtime$fun <- NULL)
  tar_script({
    tar_option_set(packages = "keras")
    options(clustermq.scheduler = "multiprocess")
    f <- function() {
      model <- keras::keras_model_sequential() %>%
        keras::layer_conv_2d(
          filters = 32,
          kernel_size = c(3, 3),
          activation = "relu",
          input_shape = c(28, 28, 1)
        ) %>%
        keras::layer_conv_2d(
          filters = 64,
          kernel_size = c(3, 3),
          activation = "relu"
        ) %>%
        keras::layer_max_pooling_2d(pool_size = c(2, 2)) %>%
        keras::layer_dropout(rate = 0.25) %>%
        keras::layer_flatten() %>%
        keras::layer_dense(units = 128, activation = "relu") %>%
        keras::layer_dropout(rate = 0.5) %>%
        keras::layer_dense(units = 10, activation = "softmax")
      keras::compile(
        model,
        loss = "categorical_crossentropy",
        optimizer = keras::optimizer_adadelta(),
        metrics = "accuracy"
      )
      model
    }
    list(
      tar_target_raw(
        name = "abc",
        command = quote(f()),
        format = "keras",
        storage = "worker",
        retrieval = "worker"
      )
    )
  })
  tar_make_clustermq()
  expect_true(inherits(tar_read(abc), "keras.engine.training.Model"))
})
