# library(testthat) # testthat::test_file("tests/testthat/test-convert_rate.R") # covr::file_coverage("R/convert_rate.R", "tests/testthat/test-convert_rate.R") # cvr <- covr::package_coverage() # covr::report(cvr) capture.output({ ## stops printing outputs on assigning test_that("convert_rate - works with default values", { expect_equal(suppressWarnings(convert_rate(10, volume = 1, time.unit = "s", oxy.unit = "mg/l")$rate.output), 36000) }) test_that("convert_rate - accepts all allowed classes of 'x' input", { # numeric expect_error(suppressWarnings(convert_rate(10, volume = 1, time.unit = "s", oxy.unit = "mg/l")), NA) expect_message(suppressWarnings(convert_rate(10, volume = 1, time.unit = "s", oxy.unit = "mg/l")), "convert_rate: Numeric input detected. Converting all numeric rates.") # calc_rate cr_obj <- suppressWarnings(calc_rate(urchins.rd[,1:2], plot = F)) ## whole dataset expect_error(suppressWarnings(convert_rate(cr_obj, volume = 1, time.unit = "s", oxy.unit = "mg/l")), NA) expect_message(suppressWarnings(convert_rate(cr_obj, volume = 1, time.unit = "s", oxy.unit = "mg/l")), "convert_rate: Object of class 'calc_rate' detected. Converting all rates in '\\$rate'.") # calc_rate.int dt <- intermittent.rd %>% subset_data(from = 1) # removes first value at 0 time because of annoying messages during adjustments dt.insp <- inspect(dt, plot = F) sts <- c(1,2100,3899) # different from help file because first row removed above cr.int_obj <- calc_rate.int(dt.insp, starts = sts, plot = F) expect_error(suppressWarnings(convert_rate(cr.int_obj, volume = 1, time.unit = "s", oxy.unit = "mg/l")), NA) expect_message(suppressWarnings(convert_rate(cr.int_obj, volume = 1, time.unit = "s", oxy.unit = "mg/l")), "convert_rate: Object of class 'calc_rate.int' detected. Converting all rates in '\\$rate'.") # auto_rate ar_obj <- suppressWarnings(calc_rate(urchins.rd[,1:2], plot = F)) ## whole dataset expect_error(suppressWarnings(convert_rate(ar_obj, volume = 1, time.unit = "s", oxy.unit = "mg/l")), NA) expect_message(suppressWarnings(convert_rate(ar_obj, volume = 1, time.unit = "s", oxy.unit = "mg/l")), "convert_rate: Object of class 'calc_rate' detected. Converting all rates in '\\$rate'.") # auto_rate.int ar.int_obj <- auto_rate.int(dt.insp, starts = sts, width = 100, measure = 600, plot = F) expect_error(suppressWarnings(convert_rate(ar.int_obj, volume = 1, time.unit = "s", oxy.unit = "mg/l")), NA) expect_message(suppressWarnings(convert_rate(ar.int_obj, volume = 1, time.unit = "s", oxy.unit = "mg/l")), "convert_rate: Object of class 'auto_rate.int' detected. Converting all rates in '\\$rate'.") # adjust_rate - with numeric input adj_rt_num <- adjust_rate(-0.01, -0.001) expect_error(suppressWarnings(convert_rate(adj_rt_num, volume = 1, time.unit = "s", oxy.unit = "mg/l")), NA) expect_message(suppressWarnings(convert_rate(adj_rt_num, volume = 1, time.unit = "s", oxy.unit = "mg/l")), "convert_rate: Object of class 'adjust_rate' detected. Converting all adjusted rates in '\\$rate.adjusted'.") # adjust_rate - with calc_rate input adj_rt_cr <- adjust_rate(cr_obj, -0.005) expect_error(suppressWarnings(convert_rate(adj_rt_cr, volume = 1, time.unit = "s", oxy.unit = "mg/l")), NA) expect_message(suppressWarnings(convert_rate(adj_rt_cr, volume = 1, time.unit = "s", oxy.unit = "mg/l")), "convert_rate: Object of class 'adjust_rate' detected. Converting all adjusted rates in '\\$rate.adjusted'.") # adjust_rate - with calc_rate.int input adj_rt_cr.int <- adjust_rate(cr.int_obj, -0.0001) expect_error(suppressWarnings(convert_rate(adj_rt_cr.int, volume = 1, time.unit = "s", oxy.unit = "mg/l")), NA) expect_message(suppressWarnings(convert_rate(adj_rt_cr.int, volume = 1, time.unit = "s", oxy.unit = "mg/l")), "convert_rate: Object of class 'adjust_rate' detected. Converting all adjusted rates in '\\$rate.adjusted'.") # adjust_rate - with auto_rate input adj_rt_ar <- adjust_rate(ar_obj, -0.005) expect_error(suppressWarnings(convert_rate(adj_rt_ar, volume = 1, time.unit = "s", oxy.unit = "mg/l")), NA) expect_message(suppressWarnings(convert_rate(adj_rt_ar, volume = 1, time.unit = "s", oxy.unit = "mg/l")), "convert_rate: Object of class 'adjust_rate' detected. Converting all adjusted rates in '\\$rate.adjusted'.") # adjust_rate - with auto_rate.int input adj_rt_ar.int <- adjust_rate(ar.int_obj, -0.0001) expect_error(suppressWarnings(convert_rate(adj_rt_ar.int, volume = 1, time.unit = "s", oxy.unit = "mg/l")), NA) expect_message(suppressWarnings(convert_rate(adj_rt_ar.int, volume = 1, time.unit = "s", oxy.unit = "mg/l")), "convert_rate: Object of class 'adjust_rate' detected. Converting all adjusted rates in '\\$rate.adjusted'.") # calc_rate.bg (incl with mass/area even tho wrong) cr.bg.obj <- calc_rate.bg(urchins.rd, time = 1, oxygen = 18:19) expect_error(suppressWarnings(convert_rate(cr.bg.obj, volume = 1, time.unit = "s", oxy.unit = "mg/l")), NA) expect_message(suppressWarnings(convert_rate(cr.bg.obj, volume = 1, time.unit = "s", oxy.unit = "mg/l")), "convert_rate: Object of class 'calc_rate.bg' detected. Converting all background rates in '\\$rate.bg'.") expect_warning(convert_rate(cr.bg.obj, volume = 1, time.unit = "s", oxy.unit = "mg/l", mass = 1), "convert_rate: A 'calc_rate.bg' \\(i.e. background) object is being converted, and a 'mass' or 'area' has been entered. Are you sure you want to do this?") expect_warning(convert_rate(cr.bg.obj, volume = 1, time.unit = "s", oxy.unit = "mg/l", area = 1), "convert_rate: A 'calc_rate.bg' \\(i.e. background) object is being converted, and a 'mass' or 'area' has been entered. Are you sure you want to do this?") # calc_rate.ft - invalid input insp.ft.obj.outO2.1col.inO2.1col<- suppressWarnings(suppressMessages(inspect.ft(flowthrough_mult.rd, time = 1, out.oxy = 2, in.oxy = 6, plot = F))) crft.obj.1rate <- calc_rate.ft(insp.ft.obj.outO2.1col.inO2.1col, from = 5, to = 900, by = "row", flowrate = 2, plot = F) expect_error(suppressWarnings(convert_rate(crft.obj.1rate, volume = 1, time.unit = "s", oxy.unit = "mg/l")), "convert_rate: Object of class 'calc_rate.ft' detected. \nPlease use 'convert_rate.ft' to convert the rate.") # none of the above - invalid input expect_error(suppressWarnings(convert_rate(urchins.rd, volume = 1, time.unit = "s", oxy.unit = "mg/l")), "convert_rate: 'x' is not an accepted input.") }) # use known warnings to do these checks # maybe make this more specific later test_that("convert_rate - falls back to default inputs properly", { expect_warning(convert_rate(10, volume = 1, time.unit = "s", oxy.unit = "mg/l"), "convert_rate: The 'output.unit' is not provided. Applying default: 'mg/h'") expect_equal(suppressWarnings(convert_rate(10, volume = 1, time.unit = "s", oxy.unit = "mg/l")$output.unit), "mgO2/hr") expect_warning(convert_rate(10, volume = 1, time.unit = "s", oxy.unit = "mg/l", mass = 1), "convert_rate: The 'output.unit' is not provided. Applying default: 'mg/h/kg'") expect_equal(suppressWarnings(convert_rate(10, volume = 1, time.unit = "s", oxy.unit = "mg/l", mass = 1)$output.unit), "mgO2/hr/kg") expect_warning(convert_rate(10, volume = 1, time.unit = "s", oxy.unit = "mg/l", area = 1), "convert_rate: The 'output.unit' is not provided. Applying default: 'mg/h/m2'") expect_equal(suppressWarnings(convert_rate(10, volume = 1, time.unit = "s", oxy.unit = "mg/l", area = 1)$output.unit), "mgO2/hr/m2") }) # test_that("convert_rate - (adjust_scale) produces valid output", { expect_is(adjust_scale(10, "mg", "kg"), "numeric") expect_is(adjust_scale(10, "ml", "l"), "numeric") }) ## test_that("convert_rate - stops if 'oxy.unit' or 'time.unit' are NULL or numeric", { expect_error(convert_rate(10, volume = 1, oxy.unit = "umol/l", time.unit = NULL), "convert_rate: The 'time.unit' of the original data is required.") expect_error(convert_rate(10, volume = 1, oxy.unit = "umol/l", time.unit = 1.1), "convert_rate: The 'time.unit' of the original data is required.") expect_error(convert_rate(10, volume = 1, oxy.unit = NULL, time.unit = "s"), "convert_rate: The 'oxy.unit' of the original data is required.") expect_error(convert_rate(10, volume = 1, oxy.unit = 1.1, time.unit = "s"), "convert_rate: The 'oxy.unit' of the original data is required.") }) test_that("convert_rate - stops if 'volume' is NULL or NOT numeric", { expect_error(convert_rate(10, volume = NULL, oxy.unit = "umol/l", time.unit = "s", output.unit = "mg/h/g"), "convert_rate: The 'volume' input is required.") expect_error(convert_rate(10, volume = "text", oxy.unit = "umol/l", time.unit = "s", output.unit = "mg/h/g"), "convert_rate: The 'volume' input is required.") }) test_that("convert_rate - stops if both 'mass' and 'area' inputs are entered", { expect_error(convert_rate(10, volume = 1, oxy.unit = "umol/l", time.unit = "s", output.unit = "mg/h/g", mass = 1, area = 1), "convert_rate: Cannot have inputs for both 'mass' and 'area'.") }) test_that("convert_rate - stops if 'output.unit' requires a 'mass' or 'area' input and neither is provided", { expect_error(convert_rate(10, volume = 1, oxy.unit = "mg/l", time.unit = "s", output.unit = "mg/h/g", mass = NULL, area = NULL), "convert_rate: 'output.unit' requires a value for 'mass' or 'area'") expect_error(convert_rate(10, volume = 1, oxy.unit = "mg/l", time.unit = "s", output.unit = "mg/h/cm2", mass = NULL, area = NULL), "convert_rate: 'output.unit' requires a value for 'mass' or 'area'") }) test_that("convert_rate - stops if a 'mass' or 'area' input entered but output.unit is not mass- or area-specific", { expect_error(convert_rate(10, volume = 1, oxy.unit = "mg/l", time.unit = "s", output.unit = "mg/h", mass = 1, area = NULL), "convert_rate: A 'mass' has been entered, but a mass-specific unit has not been specified in 'output.unit'.") expect_error(convert_rate(10, volume = 1, oxy.unit = "mg/l", time.unit = "s", output.unit = "mg/h", mass = NULL, area = 1), "convert_rate: An 'area' has been entered, but an area-specific unit has not been specified in 'output.unit'.") }) test_that("convert_rate - S3 generics work as expected", { res_abs <- convert_rate(-0.0001534657, oxy.unit = "mg/L", time.unit = "s", output.unit = "mg/h", volume = 0.0032245) res_abs_mult <- convert_rate(c(-0.0001534657, -0.00015, -0.00016, -0.00017), oxy.unit = "mg/L", time.unit = "s", output.unit = "mg/h", volume = 0.0032245) res_ms <- convert_rate(-0.0001534657, oxy.unit = "mg/L", time.unit = "s", output.unit = "mg/h/g", volume = 0.0032245, mass = 0.00534) res_as <- convert_rate(-0.0001534657, oxy.unit = "mg/L", time.unit = "s", output.unit = "mg/h/mm2", volume = 0.0032245, area = 0.000001429) ## summary expect_output(summary(res_abs)) expect_output(summary(res_ms)) expect_output(summary(res_as)) expect_error(summary(res_abs, pos = 2), "summary.convert_rate: Invalid 'pos' rank: only 1 rates found.") expect_error(summary(res_abs, pos = 2:3), "summary.convert_rate: Invalid 'pos' rank: only 1 rates found.") expect_output(summary(res_abs_mult)) expect_output(summary(res_abs_mult, pos = 2:3)) expect_output(summary(res_abs_mult, pos = 2:3), "Summary of converted rates from entered 'pos' rank\\(s)") expect_is(summary(res_abs_mult, export = TRUE), "data.table") ## print expect_output(print(res_abs)) expect_error(print(res_abs, pos = 2), "print.convert_rate: Invalid 'pos' rank: only 1 rates found.") expect_error(print(res_abs, pos = 2:3), "print.convert_rate: 'pos' must be a single value. To examine multiple results use summary().") expect_output(print(res_ms)) expect_output(print(res_as)) ## mean ## absolute expect_output(suppressWarnings(mean(res_abs))) expect_message(mean(res_abs), "mean.convert_rate: Only 1 rate found or selected. Returning mean rate anyway...") expect_equal(suppressWarnings(mean(res_abs, export = TRUE)), mean(res_abs$rate.output)) ## mass-spec expect_output(suppressWarnings(mean(res_ms))) expect_message(mean(res_ms), "mean.convert_rate: Only 1 rate found or selected. Returning mean rate anyway...") expect_equal(suppressWarnings(mean(res_ms, export = TRUE)), mean(res_ms$rate.output)) ## area-spec expect_output(suppressWarnings(mean(res_as))) expect_message(mean(res_as), "mean.convert_rate: Only 1 rate found or selected. Returning mean rate anyway...") expect_equal(suppressWarnings(mean(res_as, export = TRUE)), mean(res_as$rate.output)) ## check multiple rates have correct mean rate <- suppressWarnings(inspect(urchins.rd[,1:2], plot = F)) %>% auto_rate(plot = F) %>% convert_rate(oxy.unit = "mg/L", time.unit = "s", output.unit = "mg/h/mm2", volume = 0.0032245, area = 0.000001429) expect_output(suppressWarnings(mean(rate))) expect_equal(mean(rate, export = TRUE), mean(rate$rate.output)) # mean and pos expect_output(mean(rate, pos = 1:3), "Mean of rate results from entered 'pos' ranks:") expect_error(mean(rate, pos = 5:6), "mean.convert_rate: Invalid 'pos' rank: only 4 rates found.") }) test_that("convert_rate - stops if units require t, S and P", { expect_error(convert_rate(-0.0001534657, oxy.unit = "mL/L", time.unit = "s", output.unit = "mg/h/mm2", volume = 0.0032245, area = 0.000001429), "convert_rate: Input or output units require Salinity input") expect_error(convert_rate(-0.0001534657, oxy.unit = "mL/L", time.unit = "s", output.unit = "mg/h/mm2", volume = 0.0032245, S = 35, area = 0.000001429), "convert_rate: Input or output units require Temperature input") expect_message(convert_rate(-0.0001534657, oxy.unit = "mL/L", time.unit = "s", output.unit = "mg/h/mm2", volume = 0.0032245, S = 35, t = 31, P = NULL, area = 0.000001429), "convert_rate: Input or output units require Atmospheric Pressure input") }) ## Possibly update these in future with exact values we know are correct. ## For now, these just flag up if code changes cause output changes test_that("convert_rate - outputs correct conversion values - absolute rates", { res <- convert_rate(93.1, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h", volume = 1, S = 35, t = 25, P = 1.013253) expect_equal(res$rate.output, 22626.99, tolerance = 0.01) # exact value ## inputs and outputs are saved in object correctly expect_equal(res$rate.input, 93.1) expect_equal(res$inputs$oxy.unit, "%Air") expect_equal(res$inputs$time.unit, "sec") expect_equal(res$output.unit, "mgO2/hr") expect_equal(res$summary$rate.input, 93.1) expect_equal(res$summary$rate.output, 22626.99, tolerance = 0.01) expect_equal(res$summary$rate.abs, 22626.99, tolerance = 0.01) res <- convert_rate(4303, oxy.unit = "ug/l", time.unit = "hr", output.unit = "ml/minute", volume = 1, S = 35, t = 25, P = 1.013253) expect_equal(res$rate.output, 0.05477929, tolerance = 0.00001) # exact value ## inputs and outputs are saved in object correctly expect_equal(res$rate.input, 4303) expect_equal(res$inputs$oxy.unit, "ug/L") expect_equal(res$inputs$time.unit, "hr") expect_equal(res$output.unit, "mLO2/min") expect_equal(res$summary$rate.input, 4303) expect_equal(res$summary$rate.output, 0.05477929, tolerance = 0.00001) expect_equal(res$summary$rate.abs, 0.05477929, tolerance = 0.00001) res <- convert_rate(234, oxy.unit = "hPa", time.unit = "min", output.unit = "umol/min", volume = 1, S = 35, t = 25, P = 1.013253) expect_equal(res$rate.output, 236.739, tolerance = 0.001) # exact value ## inputs and outputs are saved in object correctly expect_equal(res$rate.input, 234) expect_equal(res$inputs$oxy.unit, "hPa") expect_equal(res$inputs$time.unit, "min") expect_equal(res$output.unit, "umolO2/min") expect_equal(res$summary$rate.input, 234) expect_equal(res$summary$rate.output, 236.739, tolerance = 0.001) expect_equal(res$summary$rate.abs, 236.739, tolerance = 0.001) # changing magnitude of inputs and outputs changes rate by right amount rate <- suppressWarnings(auto_rate(sardine.rd, plot = F)) # sign of the rate expect_equal( convert_rate(-1*rate$rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h", volume = 10, S = 35, t = 14, P = 1.013253)$rate.output, convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h", volume = 10, S = 35, t = 14, P = 1.013253)$rate.output * -1 ) # time metric in output expect_equal( convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h", volume = 10, S = 35, t = 14, P = 1.013253)$rate.output, convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/m", volume = 10, S = 35, t = 14, P = 1.013253)$rate.output*60 ) expect_equal( convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h", volume = 10, S = 35, t = 14, P = 1.013253)$rate.output, convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/s", volume = 10, S = 35, t = 14, P = 1.013253)$rate.output*60*60 ) # time metric in input expect_equal( convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h", volume = 10, S = 35, t = 14, P = 1.013253)$rate.output, convert_rate(rate, oxy.unit = "%Air", time.unit = "m", output.unit = "mg/h", volume = 10, S = 35, t = 14, P = 1.013253)$rate.output*60 ) expect_equal( convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h", volume = 10, S = 35, t = 14, P = 1.013253)$rate.output, convert_rate(rate, oxy.unit = "%Air", time.unit = "h", output.unit = "mg/h", volume = 10, S = 35, t = 14, P = 1.013253)$rate.output*60*60 ) # volume expect_equal( convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h", volume = 10, S = 35, t = 14, P = 1.013253)$rate.output, convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h", volume = 1, S = 35, t = 14, P = 1.013253)$rate.output*10 ) }) test_that("convert_rate - outputs correct conversion values - mass-specific rates", { res <- convert_rate(93.1, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/g", volume = 1, S = 35, t = 25, P = 1.013253, mass = 0.012) expect_equal(res$rate.output, 1885.583, tolerance = 0.001) # exact value ## inputs and outputs are saved in object correctly expect_equal(res$rate.input, 93.1) expect_equal(res$inputs$oxy.unit, "%Air") expect_equal(res$inputs$time.unit, "sec") expect_equal(res$output.unit, "mgO2/hr/g") expect_equal(res$summary$rate.input, 93.1) expect_equal(res$summary$rate.output, 1885.583, tolerance = 0.01) expect_equal(res$summary$rate.abs, 22626.99, tolerance = 0.01) expect_equal(res$summary$rate.m.spec, 1885.583, tolerance = 0.001) res <- convert_rate(4303, oxy.unit = "ug/l", time.unit = "hr", output.unit = "ml/minute/kg", volume = 1, S = 35, t = 25, P = 1.013253, mass = 0.012) expect_equal(res$rate.output, 4.564941, tolerance = 0.00001) # exact value ## inputs and outputs are saved in object correctly expect_equal(res$rate.input, 4303) expect_equal(res$inputs$oxy.unit, "ug/L") expect_equal(res$inputs$time.unit, "hr") expect_equal(res$output.unit, "mLO2/min/kg") expect_equal(res$summary$rate.input, 4303) expect_equal(res$summary$rate.output, 4.564941, tolerance = 0.00001) expect_equal(res$summary$rate.abs, 0.05477929, tolerance = 0.00001) expect_equal(res$summary$rate.m.spec, 4.564941, tolerance = 0.00001) res <- convert_rate(234, oxy.unit = "hPa", time.unit = "min", output.unit = "umol/min/ug", volume = 1, S = 35, t = 25, P = 1.013253, mass = 0.012) expect_equal(res$rate.output, 0.00001972825, tolerance = 0.000001) # exact value ## inputs and outputs are saved in object correctly expect_equal(res$rate.input, 234) expect_equal(res$inputs$oxy.unit, "hPa") expect_equal(res$inputs$time.unit, "min") expect_equal(res$output.unit, "umolO2/min/ug") expect_equal(res$summary$rate.input, 234) expect_equal(res$summary$rate.output, 0.00001972825, tolerance = 0.000001) expect_equal(res$summary$rate.abs, 236.739, tolerance = 0.001) expect_equal(res$summary$rate.m.spec, 0.00001972825, tolerance = 0.000001) # changing magnitude of inputs and outputs changes rate by right amount rate <- suppressWarnings(auto_rate(sardine.rd, plot = F)) # sign of the rate expect_equal( convert_rate(-1*rate$rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/g", volume = 10, S = 35, t = 14, P = 1.013253, mass = 0.012)$rate.output, convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/g", volume = 10, S = 35, t = 14, P = 1.013253, mass = 0.012)$rate.output * -1 ) # time metric in output expect_equal( convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/g", volume = 10, S = 35, t = 14, P = 1.013253, mass = 0.012)$rate.output, convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/m/g", volume = 10, S = 35, t = 14, P = 1.013253, mass = 0.012)$rate.output*60 ) expect_equal( convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/g", volume = 10, S = 35, t = 14, P = 1.013253, mass = 0.012)$rate.output, convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/s/g", volume = 10, S = 35, t = 14, P = 1.013253, mass = 0.012)$rate.output*60*60 ) # time metric in input expect_equal( convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/g", volume = 10, S = 35, t = 14, P = 1.013253, mass = 0.012)$rate.output, convert_rate(rate, oxy.unit = "%Air", time.unit = "m", output.unit = "mg/h/g", volume = 10, S = 35, t = 14, P = 1.013253, mass = 0.012)$rate.output*60 ) expect_equal( convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/g", volume = 10, S = 35, t = 14, P = 1.013253, mass = 0.012)$rate.output, convert_rate(rate, oxy.unit = "%Air", time.unit = "h", output.unit = "mg/h/g", volume = 10, S = 35, t = 14, P = 1.013253, mass = 0.012)$rate.output*60*60 ) # volume expect_equal( convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/g", volume = 10, S = 35, t = 14, P = 1.013253, mass = 0.012)$rate.output, convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/g", volume = 1, S = 35, t = 14, P = 1.013253, mass = 0.012)$rate.output*10 ) # mass expect_equal( convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/g", volume = 10, S = 35, t = 14, P = 1.013253, mass = 0.012)$rate.output, convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/kg", volume = 10, S = 35, t = 14, P = 1.013253, mass = 0.012)$rate.output/1000 ) expect_equal( convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/g", volume = 10, S = 35, t = 14, P = 1.013253, mass = 0.012)$rate.output, convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/mg", volume = 10, S = 35, t = 14, P = 1.013253, mass = 0.012)$rate.output*1000 ) expect_equal( convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/g", volume = 10, S = 35, t = 14, P = 1.013253, mass = 0.012)$rate.output, convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/ug", volume = 10, S = 35, t = 14, P = 1.013253, mass = 0.012)$rate.output*1000000 ) }) ## Kate Quigley data ## These values checked in Excel - first one is right test_that("convert_rate - outputs correct conversion values - area-specific rates", { res <- convert_rate(-0.0001534657, oxy.unit = "mg/L", time.unit = "s", output.unit = "mg/h/mm2", volume = 0.0032245, S = 35, t = 31, P = 1.013253, area = 0.000001429) expect_equal(res$rate.output, -0.001246648) # exact value ## inputs and outputs are saved in object correctly expect_equal(res$rate.input, -0.0001534657) expect_equal(res$inputs$oxy.unit, "mg/L") expect_equal(res$inputs$time.unit, "sec") expect_equal(res$output.unit, "mgO2/hr/mm2") expect_equal(res$summary$rate.input, -0.0001534657) expect_equal(res$summary$rate.output, -0.001246648) expect_equal(res$summary$rate.abs, -0.001781461) expect_equal(res$summary$rate.a.spec, -0.001246648) ## these made up res <- convert_rate(4303, oxy.unit = "ug/l", time.unit = "hr", output.unit = "ml/minute/m2", volume = 1, S = 35, t = 25, P = 1.013253, area = 0.012) expect_equal(res$rate.output, 4.564941, tolerance = 0.00001) # exact value ## inputs and outputs are saved in object correctly expect_equal(res$rate.input, 4303) expect_equal(res$inputs$oxy.unit, "ug/L") expect_equal(res$inputs$time.unit, "hr") expect_equal(res$output.unit, "mLO2/min/m2") expect_equal(res$summary$rate.input, 4303) expect_equal(res$summary$rate.output, 4.564941, tolerance = 0.00001) expect_equal(res$summary$rate.abs, 0.05477929, tolerance = 0.00001) expect_equal(res$summary$rate.a.spec, 4.564941, tolerance = 0.00001) res <- convert_rate(234, oxy.unit = "hPa", time.unit = "min", output.unit = "umol/min/cm2", volume = 1, S = 35, t = 25, P = 1.013253, area = 0.012) expect_equal(res$rate.output, 1.972825, tolerance = 0.000001) # exact value ## inputs and outputs are saved in object correctly expect_equal(res$rate.input, 234) expect_equal(res$inputs$oxy.unit, "hPa") expect_equal(res$inputs$time.unit, "min") expect_equal(res$output.unit, "umolO2/min/cm2") expect_equal(res$summary$rate.input, 234) expect_equal(res$summary$rate.output, 1.972825, tolerance = 0.000001) expect_equal(res$summary$rate.abs, 236.739, tolerance = 0.001) expect_equal(res$summary$rate.a.spec, 1.972825, tolerance = 0.000001) # changing magnitude of inputs and outputs changes rate by right amount rate <- suppressWarnings(auto_rate(sardine.rd, plot = F)) # time metric in output expect_equal( convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/cm2", volume = 10, S = 35, t = 14, P = 1.013253, area = 0.012)$rate.output, convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/m/cm2", volume = 10, S = 35, t = 14, P = 1.013253, area = 0.012)$rate.output*60 ) expect_equal( convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/cm2", volume = 10, S = 35, t = 14, P = 1.013253, area = 0.012)$rate.output, convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/s/cm2", volume = 10, S = 35, t = 14, P = 1.013253, area = 0.012)$rate.output*60*60 ) # time metric in input expect_equal( convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/cm2", volume = 10, S = 35, t = 14, P = 1.013253, area = 0.012)$rate.output, convert_rate(rate, oxy.unit = "%Air", time.unit = "m", output.unit = "mg/h/cm2", volume = 10, S = 35, t = 14, P = 1.013253, area = 0.012)$rate.output*60 ) expect_equal( convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/cm2", volume = 10, S = 35, t = 14, P = 1.013253, area = 0.012)$rate.output, convert_rate(rate, oxy.unit = "%Air", time.unit = "h", output.unit = "mg/h/cm2", volume = 10, S = 35, t = 14, P = 1.013253, area = 0.012)$rate.output*60*60 ) # volume expect_equal( convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/cm2", volume = 10, S = 35, t = 14, P = 1.013253, area = 0.012)$rate.output, convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/cm2", volume = 1, S = 35, t = 14, P = 1.013253, area = 0.012)$rate.output*10 ) # area # mm2 > cm2 > m2 > km2 # 1 x 100 x 10000 x 1000000 expect_equal( convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/mm2", volume = 10, S = 35, t = 14, P = 1.013253, area = 0.012)$rate.output, convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/cm2", volume = 10, S = 35, t = 14, P = 1.013253, area = 0.012)$rate.output/100 ) expect_equal( convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/mm2", volume = 10, S = 35, t = 14, P = 1.013253, area = 0.012)$rate.output, convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/m2", volume = 10, S = 35, t = 14, P = 1.013253, area = 0.012)$rate.output/100/10000 ) expect_equal( convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/mm2", volume = 10, S = 35, t = 14, P = 1.013253, area = 0.012)$rate.output, convert_rate(rate, oxy.unit = "%Air", time.unit = "s", output.unit = "mg/h/km2", volume = 10, S = 35, t = 14, P = 1.013253, area = 0.012)$rate.output/100/10000/1000000 ) }) test_that("convert_rate - changing 'time' inputs changes rates by correct magnitude multiplier", { # Outputs # s to m expect_equal( convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'mg/s/kg', volume = 1.2, mass = 0.5)$rate.output * 60, convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'mg/m/kg', volume = 1.2, mass = 0.5)$rate.output) # s to h expect_equal( convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'mg/s/kg', volume = 1.2, mass = 0.5)$rate.output * 60 * 60, convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'mg/h/kg', volume = 1.2, mass = 0.5)$rate.output) # s to d expect_equal( convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'mg/s/kg', volume = 1.2, mass = 0.5)$rate.output * 60 * 60 * 24, convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'mg/d/kg', volume = 1.2, mass = 0.5)$rate.output) # If inut data was different time # d to s expect_equal( convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 'day', output.unit = 'mg/s/kg', volume = 1.2, mass = 0.5)$rate.output * 60 * 60 * 24, convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 'day', output.unit = 'mg/d/kg', volume = 1.2, mass = 0.5)$rate.output) # d to m expect_equal( convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 'day', output.unit = 'mg/m/kg', volume = 1.2, mass = 0.5)$rate.output * 60 * 24, convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 'day', output.unit = 'mg/d/kg', volume = 1.2, mass = 0.5)$rate.output) # d to h expect_equal( convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 'day', output.unit = 'mg/h/kg', volume = 1.2, mass = 0.5)$rate.output * 24, convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 'day', output.unit = 'mg/d/kg', volume = 1.2, mass = 0.5)$rate.output) }) test_that("convert_rate - different magnitudes of umol/mmol/mol changes rates by correct magnitude multiplier", { expect_equal(convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'mol/s/kg', volume = 1.2, mass = 0.5)$rate.output, convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'mmol/s/kg', volume = 1.2, mass = 0.5)$rate.output/1000) expect_equal(convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'mol/s/kg', volume = 1.2, mass = 0.5)$rate.output, convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'umol/s/kg', volume = 1.2, mass = 0.5)$rate.output/1000/1000) expect_equal(convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'umol/s/kg', volume = 1.2, mass = 0.5)$rate.output, convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'mmol/s/kg', volume = 1.2, mass = 0.5)$rate.output*1000) expect_equal(convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'umol/s/kg', volume = 1.2, mass = 0.5)$rate.output, convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'nmol/s/kg', volume = 1.2, mass = 0.5)$rate.output/1000) expect_equal(convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'mol/s/kg', volume = 1.2, mass = 0.5)$rate.output, convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'nmol/s/kg', volume = 1.2, mass = 0.5)$rate.output/1000/1000/1000) expect_equal(convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'umol/s/kg', volume = 1.2, mass = 0.5)$rate.output, convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'pmol/s/kg', volume = 1.2, mass = 0.5)$rate.output/1000000) expect_equal(convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'mol/s/kg', volume = 1.2, mass = 0.5)$rate.output, convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'pmol/s/kg', volume = 1.2, mass = 0.5)$rate.output/1000/1000/1000/1000) expect_equal(c(convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'mol/s/kg', volume = 1.2, mass = 0.5)$rate.output, convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'mmol/s/kg', volume = 1.2, mass = 0.5)$rate.output/1000, convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'umol/s/kg', volume = 1.2, mass = 0.5)$rate.output/1000/1000, convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'nmol/s/kg', volume = 1.2, mass = 0.5)$rate.output/1000/1000/1000, convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'pmol/s/kg', volume = 1.2, mass = 0.5)$rate.output/1000/1000/1000/1000), rep(6.750253e-05, 5)) }) test_that("convert_rate - ml & ul oxygen output unit correct values ", { # should be ml times 1000 expect_equal(convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'ml/h/kg', volume = 1.2, mass = 0.5, S = 35, t = 12, P = 1)$rate.output * 1000, convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'ul/h/kg', volume = 1.2, mass = 0.5, S = 35, t = 12, P = 1)$rate.output) }) test_that("convert_rate - mg & ug oxygen output unit correct values ", { # should be mg times 1000 expect_equal(convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'mg/h/kg', volume = 1.2, mass = 0.5, S = 35, t = 12, P = 1)$rate.output * 1000, convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'ug/h/kg', volume = 1.2, mass = 0.5, S = 35, t = 12, P = 1)$rate.output) }) test_that("convert_rate - mm3 & cm3 (cc) oxygen output unit correct values ", { # these are equivalent to ul and ml expect_equal(convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'cm3/h/kg', volume = 1.2, mass = 0.5, S = 35, t = 12, P = 1)$rate.output * 1000, convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'mm3/h/kg', volume = 1.2, mass = 0.5, S = 35, t = 12, P = 1)$rate.output) expect_equal(convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'cm3/h/kg', volume = 1.2, mass = 0.5, S = 35, t = 12, P = 1)$rate.output, convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'ml/h/kg', volume = 1.2, mass = 0.5, S = 35, t = 12, P = 1)$rate.output) expect_equal(convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'cc/h/kg', volume = 1.2, mass = 0.5, S = 35, t = 12, P = 1)$rate.output, convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'ml/h/kg', volume = 1.2, mass = 0.5, S = 35, t = 12, P = 1)$rate.output) expect_equal(convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'mm3/h/kg', volume = 1.2, mass = 0.5, S = 35, t = 12, P = 1)$rate.output, convert_rate(0.9, oxy.unit = 'mg/l', time.unit = 's', output.unit = 'ul/h/kg', volume = 1.2, mass = 0.5, S = 35, t = 12, P = 1)$rate.output) }) # Plotting ---------------------------------------------------------------- test_that("convert_rate - plot is produced with converted auto_rate objects", { ar_mult <- suppressWarnings( urchins.rd %>% inspect(1,2, plot = FALSE) %>% auto_rate(width = 0.2, plot = FALSE) %>% convert_rate(oxy.unit = "mg/l", time.unit = "min", output.unit = "mg/h/g", volume = 1.09, mass = 0.005) ) expect_output(plot(ar_mult)) expect_output(plot(ar_mult, pos = 1:2)) expect_output(plot(ar_mult, pos = 1:2, type = "full")) expect_output(plot(ar_mult, pos = 1:2, type = "full", highlight = 2)) expect_output(plot(ar_mult, pos = 1:2, type = "overlap")) expect_output(plot(ar_mult, pos = 1:2, type = "overlap", highlight = 2)) expect_output(plot(ar_mult, pos = 1:2, type = "rate")) expect_output(plot(ar_mult, pos = 1:2, type = "rate", highlight = 2)) expect_output(plot(ar_mult, type = "overlap", highlight = 2)) # adjusted ar_mult_adj <- suppressWarnings( urchins.rd %>% inspect(1,2, plot = FALSE) %>% auto_rate(width = 0.2, plot = FALSE) %>% adjust_rate(by = -0.005) %>% convert_rate(oxy.unit = "mg/l", time.unit = "min", output.unit = "mg/h/g", volume = 1.09, mass = 0.005)) expect_output(plot(ar_mult_adj)) }) test_that("convert_rate - plot is produced with converted calc_rate objects", { cr <- suppressWarnings( urchins.rd %>% inspect(1,2, plot = FALSE) %>% calc_rate(plot = FALSE) %>% convert_rate(oxy.unit = "mg/l", time.unit = "min", output.unit = "mg/h", volume = 1.09)) expect_output(plot(cr)) }) test_that("convert_rate - plot pos and highlight correct messages", { cr <- suppressWarnings( urchins.rd %>% inspect(1,2, plot = FALSE) %>% calc_rate(plot = FALSE) %>% convert_rate(oxy.unit = "mg/l", time.unit = "min", output.unit = "mg/h", volume = 1.09)) expect_message(plot(cr, pos = 50), "convert_rate: One or more 'pos' inputs higher than number of rows in '\\$summary'. Applying default of all rows.") expect_message(plot(cr, pos = 50, type = "overlap"), "convert_rate: One or more 'pos' inputs higher than number of rows in '\\$summary'. Applying default of all rows.") expect_message(plot(cr, highlight = 50, type = "overlap"), "convert_rate: 'highlight' not within 'pos' input. Applying default of first 'pos' entry.") }) test_that("convert_rate - plot errors with various disallowed inputs", { num <- c(1,2,3) %>% convert_rate(oxy.unit = "mg/l", time.unit = "min", output.unit = "mg/h", volume = 1.09) expect_error(plot(num), "plot.convert_rate: Plot is not available for 'convert_rate' objects containing rates converted from numeric values.") crbg <- suppressWarnings(urchins.rd %>% inspect(1,2, plot = FALSE) %>% calc_rate.bg(plot = FALSE) %>% convert_rate(oxy.unit = "mg/l", time.unit = "min", output.unit = "mg/h", volume = 1.09)) expect_error(plot(crbg), "plot.convert_rate: Plot is not available for converted 'calc_rate.bg' objects because rates may come from different columns of the dataframe.") cr <- suppressWarnings(urchins.rd %>% inspect(1,2, plot = FALSE) %>% calc_rate(plot = FALSE) %>% convert_rate(oxy.unit = "mg/l", time.unit = "min", output.unit = "mg/h", volume = 1.09)) expect_error(plot(cr, type = "text"), "plot.convert_rate: 'type' input not recognised.") }) test_that("overlap.p - errors with various disallowed inputs", { crbg <- calc_rate.bg(urchins.rd[,1:2]) %>% convert_rate(oxy.unit = "mg/l", time.unit = "min", output.unit = "mg/h", volume = 1.09) expect_error(overlap.p(crbg), "overlap.p: Plot is not available for converted 'calc_rate.bg' objects because rates may come from different columns of the dataframe.") crbg <- calc_rate.bg(urchins.rd[,1:2]) expect_error(overlap.p(crbg), "overlap.p: 'x' should be an 'auto_rate' or 'convert_rate' object.") num <- c(1,2,3) %>% convert_rate(oxy.unit = "mg/l", time.unit = "min", output.unit = "mg/h", volume = 1.09) expect_error(overlap.p(num), "overlap.p: Plot is not available for 'convert_rate' objects containing rates converted from numeric values.") }) test_that("convert_rate - correct message when plot is called on objects with zero rates", { # message with zero rates for both methods ar_mult_no_rts <- suppressWarnings( urchins.rd %>% inspect(1,2, plot = FALSE) %>% auto_rate(width = 0.2, plot = FALSE) %>% convert_rate(oxy.unit = "mg/l", time.unit = "min", output.unit = "mg/h/g", volume = 1.09, mass = 0.005) %>% select_rate("rate", c(-0.05, -0.06))) expect_message(plot(ar_mult_no_rts), "convert_rate: Nothing to plot! No rates found in object.") expect_message(plot(ar_mult_no_rts, type = "overlap"), "convert_rate: Nothing to plot! No rates found in object.") }) test_that("convert_rate - plot defaults are correctly restored", { # reset plotting first dev.off() # save par before parb4 <- par(no.readonly = TRUE) # now use a fn with plot suppressWarnings(urchins.rd %>% inspect(1,2, plot = FALSE) %>% auto_rate(width = 0.2, plot = FALSE) %>% convert_rate(oxy.unit = "mg/l", time.unit = "min", output.unit = "mg/h/g", volume = 1.09, mass = 0.005, plot = TRUE)) # save after paraft <- par(no.readonly = TRUE) # mai is something changed from the default, # so if par settings not restored properly this should fail expect_identical(parb4$mai, paraft$mai) }) }) ## end capture.output