tests/testthat/test-epw.R

eplusr_option(verbose_info = FALSE)

# IDD {{{
test_that("IDD", {
    expect_s3_class(idd <- EpwIdd$new(system.file("extdata/epw.idd", package = "eplusr")), "Idd")
    expect_output(idd$print())
})
# }}}

# META {{{
test_that("Meta info", {
    skip_on_cran()

    path_epw <- path_eplus_weather(LATEST_EPLUS_VER, "USA_CA_San.Francisco.Intl.AP.724940_TMY3.epw")

    expect_s3_class(epw <- read_epw(path_epw), "Epw")

    expect_s3_class(epw <- Epw$new(path_epw), "Epw")

    # can update the path after saved
    expect_equal(epw$path(), normalizePath(path_epw))

    # can get definition
    expect_s3_class(epw$definition("LOCATION"), "IddObject")
})
# }}}

# HEADER {{{
test_that("Header getter and setter", {
    skip_on_cran()

    path_epw <- path_eplus_weather(LATEST_EPLUS_VER, "USA_CA_San.Francisco.Intl.AP.724940_TMY3.epw")

    expect_silent(epw <- Epw$new(path_epw))

    # $location() {{{
    expect_equal(
        epw$location(city = "Chongqing", state_province = "Chongqing", country = "China",
            data_source = "TMY", wmo_number = "724944", latitude = 20.0,
            longitude = -120.0, time_zone = 8L, elevation = 100
        ),
        list(city = "Chongqing",
             state_province = "Chongqing",
             country = "China",
             data_source = "TMY",
             wmo_number = "724944",
             latitude = 20.0,
             longitude = -120.0,
             time_zone = 8L,
             elevation = 100
        )
    )
    expect_equal(epw$location(city = "chongqing")$city, "chongqing")
    expect_error(epw$location(city = 1))
    # }}}

    # $design_condition() {{{
    expect_type(epw$design_condition(), "list")
    expect_equal(names(epw$design_condition()), c("source", "heating", "cooling", "extremes"))
    # }}}

    # $typical_extreme_period() {{{
    expect_s3_class(epw$typical_extreme_period(), "data.table")
    expect_equal(names(epw$typical_extreme_period()), c("index", "name", "type", "start_day", "end_day"))
    expect_equal(nrow(epw$typical_extreme_period()), 6L)
    # }}}

    # $ground_temperature {{{
    expect_s3_class(epw$ground_temperature(), "data.table")
    expect_equal(names(epw$ground_temperature()), c(
        "index",              "depth",
        "soil_conductivity",  "soil_density",  "soil_specific_heat",
        "January",            "February",      "March",
        "April",              "May",           "June",
        "July",               "August",        "September",
        "October",            "November",      "December"
    ))
    expect_equal(nrow(epw$ground_temperature()), 3L)
    # }}}

    # $ground_temperature {{{
    expect_s3_class(epw$ground_temperature(), "data.table")
    expect_equal(names(epw$ground_temperature()), c(
        "index",              "depth",
        "soil_conductivity",  "soil_density",  "soil_specific_heat",
        "January",            "February",      "March",
        "April",              "May",           "June",
        "July",               "August",        "September",
        "October",            "November",      "December"
    ))
    expect_equal(nrow(epw$ground_temperature()), 3L)
    # }}}

    # $holiday {{{
    expect_silent(epw <- Epw$new(path_epw))
    expect_type(epw$holiday(), "list")
    expect_equal(names(epw$holiday()), c("leapyear", "dst", "holiday"))

    # leapyear
    expect_s3_class(epw <- Epw$new(path_epw), "Epw")
    expect_equal(epw$holiday()$leapyear, FALSE)
    expect_error(epw$holiday(TRUE), class = "eplusr_error_epw_header")

    # change to leapyear
    expect_s3_class(epw <- Epw$new(path_epw), "Epw")
    expect_warning(d <- epw$data(1, start_year = 2016, align_wday = FALSE))
    feb29 <- d[month == 2 & day == 28][, day := 29L]
    d <- rbindlist(list(d, feb29))[order(month, day)]
    get_priv_env(epw)$idf_env()$value[object_id == 5, value_chr := {value_chr[1] <- "Yes";value_chr}]
    epw$.__enclos_env__$private$m_data <- d
    expect_true(epw$holiday()$leapyear)
    expect_error(epw$holiday(FALSE))

    # dst
    expect_s3_class(epw <- Epw$new(path_epw), "Epw")
    expect_equal(epw$holiday(dst = c(1, 2))$dst, epw_date(1:2))
    expect_equal(epw$holiday(dst = c(as.Date("2008-01-01"), as.Date("2008-02-01")))$dst, epw_date(c("Jan 01", "Feb 01")))

    # holiday
    expect_s3_class(epw <- Epw$new(path_epw), "Epw")
    expect_type(hol <- epw$holiday(holiday = list(name = "New Year", day = "Jan 01")), "list")
    expect_equal(hol$holiday,
        data.table(index = 1L, name = "New Year", day = epw_date("1/1"))
    )

    # can restore the original data
    expect_error(epw$holiday(holiday = list(name = "New Year", day = "Jan 41")))
    expect_type(hol <- epw$holiday(), "list")
    expect_equal(hol$holiday,
        data.table(index = 1L, name = "New Year", day = epw_date("1/1"))
    )
    # }}}

    # $comment() {{{
    expect_type(epw$comment1(), "character")
    expect_equal(epw$comment1("comment1"), "comment1")
    expect_equal(epw$comment1(), "comment1")
    expect_type(epw$comment2(), "character")
    expect_equal(epw$comment2("comment2"), "comment2")
    expect_equal(epw$comment2(), "comment2")
    expect_null(epw$comment2(""))
    expect_null(epw$comment2())
    expect_null(epw$comment1(NULL))
    expect_null(epw$comment1())
    # }}}

    # $num_period {{{
    expect_equal(epw$num_period(), 1L)
    # }}}

    # $interval {{{
    expect_equal(epw$interval(), 1L)
    # }}}

    # $period {{{
    expect_s3_class(epw$period(), "data.table")
    expect_s3_class(epw$period(1), "data.table")
    expect_error(epw$period(2), class = "eplusr_error_epw_data_period_index")
    expect_equal(epw$period(1, name = "test")$name, "test")
    expect_error(epw$period(1, start_day_of_week = "test"), class = "eplusr_error_validity_check")
    expect_equal(epw$period(1, start_day_of_week = 3)$start_day_of_week, "Wednesday")
    expect_equal(epw$period(1, start_day_of_week = "Wed")$start_day_of_week, "Wednesday")

    expect_error(epw$period(1, start_day_of_week = "NoDay"))
    expect_equal(epw$period(1)$start_day_of_week, "Wednesday")
    # }}}
})
# }}}

# CONSTANTS {{{
test_that("Constant data", {
    skip_on_cran()

    path_epw <- path_eplus_weather(LATEST_EPLUS_VER, "USA_CA_San.Francisco.Intl.AP.724940_TMY3.epw")

    expect_silent(epw <- Epw$new(path_epw))

    expect_type(epw$missing_code(), "list")
    expect_equal(length(epw$missing_code()), 29L)
    expect_type(epw$initial_missing_value(), "list")
    expect_equal(length(epw$initial_missing_value()), 14L)
    expect_type(epw$range_exist(), "list")
    expect_equal(length(epw$range_exist()), 28L)
    expect_type(epw$range_valid(), "list")
    expect_equal(length(epw$range_valid()), 28L)
    expect_type(epw$fill_action(), "list")
    expect_equal(names(epw$fill_action()), c("use_previous", "use_zero"))
})
# }}}

# SAVE {{{
test_that("$save() & $is_unsaved()", {
    skip_on_cran()

    path_epw <- path_eplus_weather(LATEST_EPLUS_VER, "USA_CA_San.Francisco.Intl.AP.724940_TMY3.epw")

    expect_s3_class(epw <- Epw$new(path_epw), "Epw")
    expect_s3_class(d_ori <- epw$data(), "data.table")

    # $is_unsaved() {{{
    expect_false(epw$is_unsaved())
    # }}}

    # $save() {{{
    expect_error(epw$save(".idf"))
    unlink(file.path(tempdir(), "test_save.epw"), force = TRUE)
    expect_type(epw$save(file.path(tempdir(), "test_save.epw")), "character")
    expect_error(epw$save(file.path(tempdir(), "test_save.epw")), class = "eplusr_error")
    expect_type(epw$save(overwrite = TRUE), "character")
    expect_s3_class(epw1 <- Epw$new(file.path(tempdir(), "test_save.epw")), "Epw")
    expect_equal(epw1$data(), d_ori)
    # }}}
})
# }}}

# DATA GETTER {{{
test_that("Data Getter", {
    skip_on_cran()

    path_epw <- path_eplus_weather(LATEST_EPLUS_VER, "USA_CA_San.Francisco.Intl.AP.724940_TMY3.epw")

    expect_s3_class(epw <- Epw$new(path_epw), "Epw")

    # $data() {{{
    # can get weather data
    expect_error(epw$data(2), class = "eplusr_error_epw_data_period_index")
    expect_equal(ncol(epw$data()), 36L)
    expect_equal(nrow(epw$data()), 8760L)

    # can use the origial datetime
    expect_equal(year(epw$data(align_wday = FALSE)$datetime[8760]), 1998)

    # can change year in datetime column
    expect_equal(
        epw$data(start_year = 2018, tz = "GMT")$datetime,
        seq(as.POSIXct("2018-01-01 01:00:00", tz = "GMT"),
            as.POSIXct("2019-01-01 00:00:00", tz = "GMT"),
            by = "1 hour"
        )
    )
    # can change the year column
    expect_equal(epw$data(start_year = 2018, update = TRUE)$year, c(rep(2018L, times = 8759), 2019L))

    # can detect if leap year mismatch found
    expect_warning(epw$data(start_year = 2016))
    expect_warning(epw$data(start_year = 2016, align_wday = FALSE))

    # can change the time zone of datetime column in the returned weather data
    expect_error(attr(epw$data(tz = "America/Chicago")$datetime, "tzone"), class = "eplusr_error_epw_data")
    expect_equal(attr(epw$data(start_year = 2019, tz = "Etc/GMT+8")$datetime, "tzone"), "Etc/GMT+8")

    # can detect if Feb 28 data is from a leap year. See #552
    get_priv_env(epw)$m_data[month == 2 & day == 28, year := 1988]
    get_priv_env(epw)$m_data[month == 2 & day == 28,
        datetime := lubridate::make_datetime(
            year, month, day, hour, minute
    )]
    expect_equal(nrow(epw$data()), 8760)
    # }}}

    # $abnormal_data() {{{
    expect_equal(nrow(epw$abnormal_data()), 8760)
    expect_equal(nrow(epw$abnormal_data(type = "missing")), 8760)
    expect_equal(nrow(epw$abnormal_data(type = "out_of_range")), 0L)
    expect_true("line" %in% names(epw$abnormal_data()))
    expect_equal(ncol(epw$abnormal_data()), 37L)
    expect_equal(ncol(epw$abnormal_data(keep_all = FALSE)), 12L)
    expect_equal(nrow(epw$abnormal_data(cols = "albedo")), 2160L)
    expect_equal(ncol(epw$abnormal_data(cols = "albedo", keep_all = FALSE)), 8L)
    expect_equal(nrow(epw$abnormal_data(cols = "albedo", type = "out_of_range")), 0L)
    # }}}

    # $redudant_data() {{{
    expect_equal(nrow(epw$redundant_data()), 0L)
    # }}}
})
# }}}

# DATA TAGGER {{{
test_that("Data Tagger", {
    skip_on_cran()

    path_epw <- path_eplus_weather(LATEST_EPLUS_VER, "USA_CA_San.Francisco.Intl.AP.724940_TMY3.epw")

    expect_s3_class(epw <- Epw$new(path_epw), "Epw")

    # $make_na() {{{
    expect_true({
        epw$make_na(missing = TRUE, out_of_range = TRUE)
        all(is.na(epw$abnormal_data(cols = "albedo", keep_all = FALSE, type = "missing")$albedo))
    })
    expect_message(with_verbose(epw$make_na(missing = TRUE, out_of_range = TRUE)), "already")
    # }}}

    # $fill_abnormal() {{{
    expect_equal(
        {
            epw$fill_abnormal(missing = TRUE, out_of_range = TRUE, special = TRUE)
            epw$abnormal_data(cols = "albedo", keep_all = FALSE, type = "missing")$albedo
        }, rep(999, 2160)
    )
    expect_message(with_verbose(epw$fill_abnormal(missing = TRUE, out_of_range = TRUE)), "already")
    # }}}

    # $add_unit() & $drop_unit() {{{
    expect_s3_class(class = "units",
        {
            epw$add_unit()
            rad <- epw$data()$direct_normal_radiation
        }
    )
    expect_true(all(units(rad)$numerator %in% c("W", "h")))
    expect_equal(units(rad)$denominator, c("m", "m"))
    expect_message(with_verbose(epw$add_unit()), "already")

    expect_type(epw$drop_unit()$data()$dry_bulb_temperature, "double")
    expect_message(with_verbose(epw$drop_unit()), "already")
    # }}}

    # $purge() {{{
    expect_s3_class(epw <- Epw$new(path_epw), "Epw")
    expect_s3_class(epw$purge(), "Epw")
    epw$.__enclos_env__$private$m_data <- rbindlist(list(get_priv_env(epw)$m_data, epw$data()))
    expect_message(with_verbose(epw$purge()))
    # }}}
})
# }}}

# DATA SETTER {{{
test_that("Data Setter", {
    skip_on_cran()

    path_epw <- path_eplus_weather(LATEST_EPLUS_VER, "USA_CA_San.Francisco.Intl.AP.724940_TMY3.epw")

    expect_s3_class(epw <- read_epw(path_epw), "Epw")

    # $set() {{{
    expect_s3_class(d <- epw$data(start_year = 2017), "data.table")
    expect_output(with_verbose(epw$set(d, realyear = TRUE)))
    expect_equal(epw$period(),
        data.table(index = 1L, name = "Data", start_day_of_week = "Sunday",
            start_day = epw_date("2017/1/1"), end_day = epw_date("2017/12/31")
        )
    )

    expect_warning(expect_warning(epw$set(d, realyear = TRUE, start_day_of_week = "Monday")))
    expect_warning(epw$set(d, realyear = TRUE))
    expect_equal(epw$period()$start_day_of_week, "Sunday")

    expect_s3_class(epw$set(d[1:48]), "Epw")
    expect_equal(epw$period(),
        data.table(index = 1L, name = "Data", start_day_of_week = "Sunday",
            start_day = epw_date("1/1", F), end_day = epw_date("1/2", F)
        )
    )
    expect_equal(nrow(epw$data()), 48L)

    # can remove extra columns
    set(d, NULL, "extra_column", 1)
    expect_s3_class(epw$set(d), "Epw")
    expect_equal(ncol(epw$data()), 36)

    expect_error({
        epw <- read_epw(path_epw)
        suppressWarnings(d <- epw$data(start_year = 2020))
        epw$set(d, TRUE)
    })

    expect_error({
        epw <- read_epw(path_epw)
        suppressWarnings(d <- epw$data(start_year = 2020))
        d[100L, datetime := lubridate::as_datetime("2020-01-01 00:00:00")]
        epw$set(d)
    })
    # }}}

    # $add() {{{
    expect_s3_class(epw <- Epw$new(path_epw), "Epw")

    expect_error(epw$add(epw$data()), class = "eplusr_error_parse_epw")

    # after 0L
    expect_output(with_verbose(epw$add(epw$data(start_year = 2017), realyear = TRUE)))
    expect_equal(epw$period()$name, c("Data1", "Data"))
    expect_equal(lubridate::year(epw$data(1, align_wday = FALSE)$datetime[1]), 2017)
    expect_equal(get_priv_env(epw)$m_log$matched,
        data.table(index = 1:2, row = c(1L, 8761L), num = rep(8760L, 2))
    )

    # after N
    expect_warning(d <- epw$data(start_year = 2014, align_wday = FALSE))
    expect_s3_class(epw$add(d, after = 10, realyear = TRUE), "Epw")
    expect_equal(epw$period()$name, c("Data1", "Data", "Data2"))
    expect_equal(lubridate::year(epw$data(3, align_wday = FALSE)$datetime[1]), 2014)
    expect_equal(get_priv_env(epw)$m_log$matched,
        data.table(index = 1:3, row = c(1L, 8761L, 17521L), num = rep(8760L, 3))
    )

    # between
    expect_warning(d <- epw$data(1, start_year = 2013, align_wday = FALSE))
    expect_s3_class(epw$add(d, after = 2, realyear = TRUE), "Epw")
    expect_equal(lubridate::year(epw$data(3, align_wday = FALSE)$datetime[1]), 2013)
    expect_equal(get_priv_env(epw)$m_log$matched,
        data.table(index = 1:4, row = c(1L, 8761L, 17521L, 26281L), num = rep(8760L, 4))
    )

    # unit + no unit
    expect_s3_class(epw <- Epw$new(path_epw), "Epw")
    expect_s3_class(d <- epw$data(start_year = 2017), "data.table")
    expect_s3_class(epw$add_unit(), "Epw")
    expect_s3_class(epw$add(d, realyear = TRUE), "Epw")
    expect_warning(u <- units(epw$data()$liquid_precip_rate)$numerator)
    expect_equal(u, "h")

    # unit + unit
    expect_s3_class(epw <- Epw$new(path_epw), "Epw")
    expect_s3_class(epw$add_unit(), "Epw")
    expect_s3_class(d <- epw$data(start_year = 2017), "data.table")
    expect_s3_class(epw$add(d, realyear = TRUE), "Epw")
    expect_warning(u <- units(epw$data()$liquid_precip_rate)$numerator)
    expect_equal(u, "h")

    # no unit + unit
    expect_s3_class(epw <- Epw$new(path_epw), "Epw")
    expect_s3_class(epw$add_unit(), "Epw")
    expect_s3_class(d <- epw$data(start_year = 2017), "data.table")
    expect_s3_class(epw$drop_unit(), "Epw")
    expect_s3_class(epw$add(d, realyear = TRUE), "Epw")
    expect_warning(u <- epw$data()$liquid_precip_rate)
    expect_type(u, "double")

    # no na + na
    expect_s3_class(epw <- Epw$new(path_epw), "Epw")
    expect_s3_class(epw$make_na(TRUE, TRUE), "Epw")
    expect_s3_class(d <- epw$data(start_year = 2017), "data.table")
    expect_s3_class(epw$fill_abnormal(TRUE, TRUE), "Epw")
    expect_s3_class(epw$add(d, realyear = TRUE), "Epw")
    expect_true(all(!is.na(epw$abnormal_data(cols = "albedo", keep_all = FALSE, type = "missing")$albedo)))

    # na + no na
    expect_s3_class(epw <- Epw$new(path_epw), "Epw")
    expect_s3_class(d <- epw$data(start_year = 2017), "data.table")
    expect_s3_class(epw$make_na(TRUE, TRUE), "Epw")
    expect_s3_class(epw$add(d, realyear = TRUE), "Epw")
    expect_true(all(is.na(epw$abnormal_data(cols = "albedo", keep_all = FALSE, type = "missing")$albedo)))

    # can remove extra columns
    expect_s3_class(epw <- Epw$new(path_epw), "Epw")
    expect_s3_class(d <- epw$data(start_year = 2017), "data.table")
    set(d, NULL, "extra_column", 1)
    expect_s3_class(epw$add(d, realyear = TRUE), "Epw")
    expect_warning(d <- epw$data())
    expect_equal(ncol(d), 36)
    # }}}

    # $del() {{{
    expect_s3_class(epw <- Epw$new(path_epw), "Epw")

    expect_error(epw$del())
    expect_error(epw$del(1))

    expect_s3_class(epw$add(epw$data(start_year = 2017), realyear = TRUE), "Epw")
    expect_message(with_verbose(epw$del(1)))
    # }}}
})
# }}}

# CLONE {{{
test_that("$clone()", {
    skip_on_cran()

    path_epw <- path_eplus_weather(LATEST_EPLUS_VER, "USA_CA_San.Francisco.Intl.AP.724940_TMY3.epw")
    expect_s3_class(epw1 <- Epw$new(path_epw), "Epw")

    epw2 <- epw1$clone()
    epw2$period(1, name = "Data2")
    expect_equal(epw1$period()$name, "Data")
    expect_equal(epw2$period()$name, "Data2")
})
# }}}

# PRINT {{{
test_that("$print()", {
    skip_on_cran()

    path_epw <- path_eplus_weather(LATEST_EPLUS_VER, "USA_CA_San.Francisco.Intl.AP.724940_TMY3.epw")

    expect_silent(epw <- Epw$new(path_epw))

    # $print() {{{
    expect_output(epw$print())
    # }}}
})
# }}}

# S3 FORMAT {{{
test_that("str.Epw & format.Epw", {
    skip_on_cran()

    path_epw <- path_eplus_weather(LATEST_EPLUS_VER, "USA_CA_San.Francisco.Intl.AP.724940_TMY3.epw")

    expect_silent(epw <- Epw$new(path_epw))
    expect_output(str(epw))
    expect_type(format(epw), "character")
})
# }}}

# S3 EQUALITY {{{
test_that("==.Epw & !=.Epw", {
    skip_on_cran()

    path_epw <- path_eplus_weather(LATEST_EPLUS_VER, "USA_CA_San.Francisco.Intl.AP.724940_TMY3.epw")

    expect_silent(epw <- Epw$new(path_epw))

    expect_true(epw == epw)
    expect_false(epw == Epw$new(path_epw))
    expect_false(epw == 1)
    expect_false(epw != epw)
    expect_true(epw != Epw$new(path_epw))
})
# }}}

# DOWNLOAD_WEATHER {{{
test_that("download_weather()", {
    skip_on_cran()

    skip_if(Sys.getenv("_EPLUSR_SKIP_TESTS_DOWNLOAD_EPW_") != "")
    # download weather
    expect_message({path_epw <- with_verbose(
        download_weather("USA_CA_San.Francisco.Intl.AP.724940_TMY3", ask = FALSE, type = "epw", dir = tempdir(), max_match = 2)
    )})
    expect_message({path_epw <- with_verbose(
        download_weather("Nanjing.*TMYx.2004-2018", "Nanjing", ask = FALSE, type = "epw", dir = tempdir(), max_match = 1)
    )})
})
# }}}

# vim: set fdm=marker:
hongyuanjia/eplusr documentation built on Feb. 14, 2024, 5:38 a.m.