aboutsummaryrefslogtreecommitdiffstats
path: root/src/trial.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/trial.rs')
-rw-r--r--src/trial.rs86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/trial.rs b/src/trial.rs
new file mode 100644
index 0000000..9604f62
--- /dev/null
+++ b/src/trial.rs
@@ -0,0 +1,86 @@
+use chrono::{DateTime, Local, TimeZone};
+
+use errors::DurationError;
+
+// Start timestamp on October 1 at 23h
+// Trial should be valid until November 1 00h
+
+
+const DAYS_REMAINING: u8 = 30;
+
+fn days_remaining(
+ start: DateTime<Local>,
+ now: DateTime<Local>,
+ days_available: u8,
+) -> Result<u8, DurationError> {
+ let duration = (now.date() - start.date()).num_days() as u8;
+
+ if duration > days_available {
+ Err(
+ DurationError::NegativeDuration(days_available as i32 - duration as i32)
+ )
+ } else {
+ Ok(days_available - duration)
+ }
+}
+
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn days_remaining_counts_days_remaining_from_start_date() {
+ let remaining = days_remaining(
+ Local.ymd(2018, 10, 1).and_hms(23, 1, 0),
+ Local.ymd(2018, 10, 1).and_hms(23, 30, 0),
+ 30,
+ );
+
+ assert_eq!(remaining, Ok(30));
+ }
+
+ #[test]
+ fn days_remaining_with_middle_date() {
+ let remaining = days_remaining(
+ Local.ymd(2018, 10, 1).and_hms(23, 1, 0),
+ Local.ymd(2018, 10, 22).and_hms(15, 0, 0),
+ 30,
+ );
+
+ assert_eq!(remaining, Ok(9));
+ }
+
+ #[test]
+ fn days_remaining_on_last_day_is_0() {
+ let remaining = days_remaining(
+ Local.ymd(2018, 10, 1).and_hms(23, 1, 0),
+ Local.ymd(2018, 10, 31).and_hms(23, 30, 0),
+ 30,
+ );
+
+ assert_eq!(remaining, Ok(0));
+ }
+
+ #[test]
+ fn days_remaining_on_day_following_last_day_is_negative_duration_error() {
+ let remaining = days_remaining(
+ Local.ymd(2018, 10, 1).and_hms(23, 1, 0),
+ Local.ymd(2018, 11, 1).and_hms(0, 0, 0),
+ 30,
+ );
+
+ assert_eq!(remaining, Err(DurationError::NegativeDuration(-1)));
+ }
+
+ #[test]
+ fn days_remaining_after_last_day_is_negative_duration_error() {
+ let remaining = days_remaining(
+ Local.ymd(2018, 10, 1).and_hms(23, 1, 0),
+ Local.ymd(2018, 11, 5).and_hms(0, 0, 0),
+ 30,
+ );
+
+ assert_eq!(remaining, Err(DurationError::NegativeDuration(-5)));
+ }
+}