advent_of_rust/lib.rs
1#![doc = include_str!("../README.md")]
2pub use paste::paste;
3
4/// Utility macro to declare advent of rust tests.
5///
6/// See crate-level documentation for more information
7///
8/// # Examples
9///
10/// ```ignore
11/// advent_of_rust::advent_of_rust! {
12/// 1 => 1234, "Advent of Rust!";
13/// 2 => "hello";
14/// }
15/// ```
16#[macro_export]
17macro_rules! advent_of_rust {
18 ($($day:expr => $part_1:expr $(, $part_2:expr)?);* $(;)?) => {
19 use $crate::paste;
20
21 paste! {
22 $(mod [<day_ $day>];)*
23
24 pub fn ignore_clippy_unused_errors() {
25 $(
26 let _ = [<day_ $day>]::part_1;
27 $(
28 let _ = [<day_ $day>]::part_2;
29 let _ = $part_2;
30 )?
31 )*
32 }
33
34 #[cfg(test)]
35 mod tests {
36 use super::*;
37 $(
38 const [<DAY_ $day _INPUT>]: &str = include_str!(concat!("day_", $day, ".txt"));
39
40 #[test]
41 fn [<day_ $day _part_1>]() {
42 assert_eq!([<day_ $day>]::part_1([<DAY_ $day _INPUT>]), $part_1);
43 }
44
45 $(
46 #[test]
47 fn [<day_ $day _part_2>]() {
48 assert_eq!([<day_ $day>]::part_2([<DAY_ $day _INPUT>]), $part_2);
49 }
50 )?
51 )*
52 }
53 }
54 };
55}