tests/testthat/test-infer_interval.R

# script: test-infer_interval
# author: Serkan Korkmaz, serkor1@duck.com
# date: 2024-05-24
# objective: Test the infer_interval-function
# and assert that it infers the intervals passed
# into the function.
# script start;

testthat::test_that(
  desc = "
  All inferred intervals corresponds
  to the actual passed intervals
  ",
  code = {

    # 1) extract exchanges
    exchanges <- suppressMessages(
      cryptoQuotes::available_exchanges(
        type = "ohlc"
      )
    )

    for (exchange in exchanges) {

      for (lgl in c(TRUE, FALSE)) {

        # 0) extract intervals
        # based on exchange and
        # market
        intervals <- suppressMessages(
          cryptoQuotes::available_intervals(
            source = exchange,
            futures = lgl
          )
        )

        # 1) check if its a character
        # vector
        testthat::expect_true(
          inherits(
            intervals,
            "character"
          )
        )

        # 2) create a vector
        # of TRUE/FALSE values
        # based on the inferred interval
        lgl_vector <- vapply(
          X   = intervals,
          FUN = function(x) {

            # 2.0) setup values 
            
            # extract granularity
            # from the interval
            granularity <- gsub(
              pattern = "([0-9]*)",
              x = x,
              replacement = ""
            )

            granularity <- switch(
              EXPR = granularity,
              s = "secs",
              m = "mins",
              h = "hours",
              w = "weeks",
              d = "days",
              M = "months"
            )

            # extract the value
            # so it fits the granularity
            # 1m, 2m etc.
            value <- as.integer(
              gsub("([a-zA-Z]+)", "", x)
            )

            # 2.1) Generate
            # date intervals using default_dates
            date_interval <- cryptoQuotes:::default_dates(
              interval =  x,
              length   = 200
            )

            # 2.2) extrapolate
            # the dates between from and
            # to.
            dates <- seq(
              from       = date_interval$from,
              to         = date_interval$to,
              # Add 1 if the interval is days as
              # the default_date adds 1 day if chosen
              # to avoid errors due to conversion
              # on API level
              # on API level
              by = paste0("+", value, " ", granularity)
            )

            # 2.3) assert that
            # the passed interval x is
            # equal to the inferred interval
            setequal(
              x = x,
              y = cryptoQuotes:::infer_interval(
                x = xts::xts(
                  x        = seq_len(length(dates)),
                  order.by = dates
                )

              )
            )

          },
          FUN.VALUE = logical(1)
        )


        testthat::expect_true(
          all(
            lgl_vector
          )
        )
      }

    }

  }
)

# script end;

Try the cryptoQuotes package in your browser

Any scripts or data that you put into this service are public.

cryptoQuotes documentation built on April 4, 2025, 2:33 a.m.