aboutsummaryrefslogtreecommitdiff
path: root/challenge-285/ppentchev/rust/src/tests/routes.rs
blob: 5f5b98c46c19622a8c438b290916ab73bffb2174 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// SPDX-FileCopyrightText: Peter Pentchev <roam@ringlet.net>
// SPDX-License-Identifier: BSD-2-Clause
//! Test the first task for week 285, "No Connection".

use anyhow::{bail, Context, Result};
use rstest::rstest;
use tracing_test::traced_test;

use crate::defs::Error;
use crate::routes;

/// Check whether the first task solver works.
#[traced_test]
#[rstest]
#[case(
    &[
        ("me".to_owned(), "you".to_owned()),
    ],
    "you",
)]
#[case(
    &[
        ("here".to_owned(), "there".to_owned()),
        ("here".to_owned(), "everywhere".to_owned()),
        ("there".to_owned(), "everywhere".to_owned()),
    ],
    "everywhere",
)]
#[case(
    &[("B".to_owned(), "C".to_owned()), ("D".to_owned(), "B".to_owned()), ("C".to_owned(), "A".to_owned())],
    "A",
)]
#[case(&[("A".to_owned(), "Z".to_owned())], "Z")]
fn test_connection(#[case] routes: &[(String, String)], #[case] expected: &str) -> Result<()> {
    println!();
    let found = routes::solve_no_connection(routes).context("Could not solve 285/1")?;
    assert_eq!(found, expected);
    Ok(())
}

/// Check whether the first task solver reports errors as expected.
#[traced_test]
#[rstest]
#[case(&[])]
#[case(&[
    ("here".to_owned(), "there".to_owned()),
    ("here".to_owned(), "everywhere".to_owned()),
])]
#[case(&[
    ("me".to_owned(), "you".to_owned()),
    ("you".to_owned(), "me".to_owned()),
])]
fn test_no_connection(#[case] routes: &[(String, String)]) -> Result<()> {
    println!();
    match routes::solve_no_connection(routes) {
        Ok(res) => bail!("Unexpected success: {res:?}"),
        Err(Error::NoSolution(_)) => Ok(()),
        Err(err) => Err(err).context("Unexpected error"),
    }
}