2022-11-29 12:29:49 +01:00
#[ macro_export ]
macro_rules ! boilerplate {
(
TEST_INPUT = = $ti : literal ,
tests : {
2022-12-15 10:53:56 +01:00
$( $part : ident : { $( $tpi : expr $(, $ati : expr ) * = > $to : expr ) , + $(, ) ? } ) , * $(, ) ?
2022-11-29 12:29:49 +01:00
} ,
2022-12-08 11:36:21 +01:00
$( unittests : {
2022-12-08 12:32:14 +01:00
$( $unittest : ident : { $( $( $utpi : expr ) , + = > $uto : expr ) , + $(, ) ? } ) , * $(, ) ?
2022-12-08 11:36:21 +01:00
} , ) ?
2022-12-15 10:53:56 +01:00
bench1 $( ( $bi1 : literal ) ) ? = = $b1 : literal ,
2022-12-15 13:08:15 +01:00
bench2 $( ( $bi2 : literal ) ) ? = = $b2 : literal ,
2022-12-12 11:40:49 +01:00
bench_parse : $input_fn : expr = > $it : expr $(, ) ?
2022-11-29 12:29:49 +01:00
) = > {
fn main ( ) {
2022-12-02 11:03:05 +01:00
let raw_input = read_file ( DAY ) ;
let input = parse_input ( & raw_input ) ;
2022-12-15 10:53:56 +01:00
println! ( " Part 1: {} " , part1 ( & input $(, $bi1 ) ? ) ) ;
2022-12-15 13:08:15 +01:00
println! ( " Part 2: {} " , part2 ( & input $(, $bi2 ) ? ) ) ;
2022-11-29 12:29:49 +01:00
}
#[ cfg(test) ]
mod tests {
use super ::* ;
use aoc2022 ::* ;
const TEST_INPUT : & str = $ti ;
2022-12-08 11:36:21 +01:00
$( $( $( paste ::paste! {
#[ test ]
fn [ < $unittest _test_ $uto :lower > ] ( ) {
2022-12-08 12:32:14 +01:00
assert_eq! ( $unittest ( $( $utpi ) , + ) , $uto ) ;
2022-12-08 11:36:21 +01:00
}
} ) + ) * ) ?
2022-11-29 12:56:07 +01:00
$( $( paste ::paste! {
#[ test ]
2022-12-05 11:15:40 +01:00
fn [ < $part _test_ $to :lower > ] ( ) {
2022-11-29 12:56:07 +01:00
let input = parse_input ( $tpi ) ;
2022-12-15 10:53:56 +01:00
assert_eq! ( $part ( & input , $( $ati ) , * ) , $to ) ;
2022-11-29 12:29:49 +01:00
}
2022-11-29 12:56:07 +01:00
} ) + ) *
2022-12-15 10:53:56 +01:00
bench! ( part1 ( $( $bi1 ) ? ) = = $b1 ) ;
2022-12-15 13:08:15 +01:00
bench! ( part2 ( $( $bi2 ) ? ) = = $b2 ) ;
2022-11-29 12:29:49 +01:00
#[ bench ]
fn bench_input_parsing ( b : & mut test ::Bencher ) {
let raw = & read_file ( DAY ) ;
b . iter ( | | assert_eq! ( $input_fn ( & parse_input ( test ::black_box ( & raw ) ) ) , $it ) ) ;
}
}
}
}
#[ macro_export ]
macro_rules ! bench {
2022-12-15 10:53:56 +01:00
( $part : ident ( $( $bi : literal ) ? ) = = $expected :expr ) = > {
2022-11-29 12:29:49 +01:00
paste ::paste! {
#[ bench ]
fn [ < $part _bench > ] ( b : & mut test ::Bencher ) {
let raw = & read_file ( DAY ) ;
let input = parse_input ( & raw ) ;
2022-12-15 10:53:56 +01:00
b . iter ( | | assert_eq! ( $part ( test ::black_box ( & input ) $(, $bi ) ? ) , $expected ) ) ;
2022-11-29 12:29:49 +01:00
}
}
} ;
}