diff options
| author | Arnaud Bailly <arnaud.bailly@iohk.io> | 2024-10-14 08:10:21 +0200 |
|---|---|---|
| committer | Arnaud Bailly <arnaud.bailly@iohk.io> | 2024-10-14 08:10:21 +0200 |
| commit | ac8b273d21ad4c50a1abe4583cfcaf540530eb6f (patch) | |
| tree | 01bb4ea582c23ba2c7232ab52f9baecdac1980cd | |
| parent | f356030ecb84a925848f59912cf880ff293b9286 (diff) | |
| download | lambda-nantes-ac8b273d21ad4c50a1abe4583cfcaf540530eb6f.tar.gz | |
Refactor test result handling to separate mutation from evaluation
| -rw-r--r-- | rust/src/web.rs | 126 |
1 files changed, 93 insertions, 33 deletions
diff --git a/rust/src/web.rs b/rust/src/web.rs index 7e03249..8ee3075 100644 --- a/rust/src/web.rs +++ b/rust/src/web.rs @@ -135,8 +135,28 @@ impl Client { ) } - fn check_result(&mut self, expected: &String, response: &Result<String, TestResult>) -> Test { - let timestamp = chrono::offset::Utc::now(); + /// Applies a `Test` to update client's state + fn apply(&mut self, test: &Test) { + match test.result { + TestResult::TestSucceeded => { + self.grade = self.grade.saturating_add(1); + self.delay = Duration::from_secs_f64(self.delay.as_secs_f64() * 0.8); + if self.delay.as_millis() < 500 { + self.delay = Duration::from_millis(500); + } + } + TestResult::TestFailed(_) => { + self.delay = Duration::from_secs_f64(self.delay.as_secs_f64() * 1.2); + if self.delay.as_secs() > 30 { + self.delay = Duration::from_secs(30); + } + } + _ => (), + } + self.results.push(test.clone()); + } + + fn check_result(&self, expected: &String, response: &Result<String, TestResult>) -> Test { let result = match response { Ok(expr) => { let vals = parse(expr); @@ -146,25 +166,17 @@ impl Client { .collect::<Vec<_>>() .join("\n"); if actual == *expected { - self.grade = self.grade.saturating_add(1); - self.delay = Duration::from_secs_f64(self.delay.as_secs_f64() * 0.8); - if self.delay.as_millis() < 500 { - self.delay = Duration::from_millis(500); - } TestResult::TestSucceeded } else { - self.delay = Duration::from_secs_f64(self.delay.as_secs_f64() * 1.2); - if self.delay.as_secs() > 30 { - self.delay = Duration::from_secs(30); - } TestResult::TestFailed(actual) } } Err(res) => res.clone(), }; - let test = Test { result, timestamp }; - self.results.push(test.clone()); - test + Test { + result, + timestamp: chrono::offset::Utc::now(), + } } } @@ -319,7 +331,8 @@ async fn send_tests(client_m: Arc<Mutex<Client>>) { let (input, expected) = client.generate_expr(); let response = send_test(&input, &client.url).await; - client.check_result(&expected, &response); + let test = client.check_result(&expected, &response); + client.apply(&test); } } } @@ -681,24 +694,61 @@ mod app_tests { #[test] async fn client_increases_grade_on_successful_test() { let mut client = client(); + let test = Test { + timestamp: chrono::offset::Utc::now(), + result: TestResult::TestSucceeded, + }; + + client.apply(&test); + + assert_eq!(2, client.grade); + } + + #[test] + async fn client_stores_test_results() { + let mut client = client(); + let test = Test { + timestamp: chrono::offset::Utc::now(), + result: TestResult::TestSucceeded, + }; + + client.apply(&test); + + assert_eq!(test, client.results.first().unwrap().clone()); + } + + #[test] + async fn client_returns_test_successful_if_result_match() { + let client = client(); let expected = "1".to_string(); let response = Ok("1".to_string()); let test = client.check_result(&expected, &response); assert_eq!(TestResult::TestSucceeded, test.result); - assert_eq!(2, client.grade); } #[test] - async fn client_does_not_increase_grade_on_failed_test() { - let mut client = client(); + async fn client_returns_test_failed_given_result_do_not_match() { + let client = client(); let expected = "1".to_string(); let response = Ok("2".to_string()); let test = client.check_result(&expected, &response); assert_eq!(TestResult::TestFailed("2".to_string()), test.result); + } + + #[test] + async fn client_does_not_increase_grade_on_failed_test() { + let mut client = client(); + let test = Test { + timestamp: chrono::offset::Utc::now(), + result: TestResult::TestFailed("2".to_string()), + }; + + client.apply(&test); + assert_eq!(1, client.grade); } @@ -714,11 +764,13 @@ mod app_tests { #[test] async fn client_increases_delay_to_next_upon_failed_test() { let mut client = client(); - let expected = "1".to_string(); - let response = Ok("2".to_string()); + let test = Test { + timestamp: chrono::offset::Utc::now(), + result: TestResult::TestFailed("2".to_string()), + }; let delay_before = client.time_to_next_test(); - client.check_result(&expected, &response); + client.apply(&test); assert!(delay_before < client.time_to_next_test()); } @@ -726,11 +778,13 @@ mod app_tests { #[test] async fn client_increases_delay_to_maximum_of_30s() { let mut client = client(); - let expected = "1".to_string(); - let response = Ok("2".to_string()); + let test = Test { + timestamp: chrono::offset::Utc::now(), + result: TestResult::TestFailed("2".to_string()), + }; for _ in 0..100 { - client.check_result(&expected, &response); + client.apply(&test); } assert_eq!(Duration::from_secs(30), client.time_to_next_test()); @@ -739,11 +793,13 @@ mod app_tests { #[test] async fn client_score_cannot_go_beyond_255() { let mut client = client(); - let expected = "1".to_string(); - let response = Ok("1".to_string()); + let test = Test { + timestamp: chrono::offset::Utc::now(), + result: TestResult::TestSucceeded, + }; for _ in 0..256 { - client.check_result(&expected, &response); + client.apply(&test); } assert_eq!(255, client.grade); @@ -752,11 +808,13 @@ mod app_tests { #[test] async fn client_decreases_delay_to_next_upon_successful_test() { let mut client = client(); - let expected = "1".to_string(); - let response = Ok("1".to_string()); + let test = Test { + timestamp: chrono::offset::Utc::now(), + result: TestResult::TestSucceeded, + }; let delay_before = client.time_to_next_test(); - client.check_result(&expected, &response); + client.apply(&test); assert!(delay_before > client.time_to_next_test()); } @@ -764,11 +822,13 @@ mod app_tests { #[test] async fn client_decreases_delay_to_minimum_of_500ms() { let mut client = client(); - let expected = "1".to_string(); - let response = Ok("1".to_string()); + let test = Test { + timestamp: chrono::offset::Utc::now(), + result: TestResult::TestSucceeded, + }; for _ in 0..100 { - client.check_result(&expected, &response); + client.apply(&test); } assert_eq!(Duration::from_millis(500), client.time_to_next_test()); |
