2022-11-29 12:29:49 +01:00
#[ macro_export ]
macro_rules ! boilerplate {
(
TEST_INPUT = = $ti : literal ,
tests : {
2022-12-08 11:36:21 +01:00
$( $part : ident : { $( $tpi : expr = > $to : expr ) , + $(, ) ? } ) , * $(, ) ?
2022-11-29 12:29:49 +01:00
} ,
2022-12-08 11:36:21 +01:00
$( unittests : {
$( $unittest : ident : { $( $utpi : expr = > $uto : expr ) , + $(, ) ? } ) , * $(, ) ?
} , ) ?
2022-11-29 12:29:49 +01:00
bench1 = = $b1 : literal ,
bench2 = = $b2 : literal ,
2022-11-29 12:56:07 +01:00
bench_parse : $input_fn : expr = > $it : literal $(, ) ?
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-11-29 12:29:49 +01:00
println! ( " Part 1: {} " , part1 ( & input ) ) ;
println! ( " Part 2: {} " , part2 ( & input ) ) ;
}
#[ 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 > ] ( ) {
assert_eq! ( $unittest ( & $utpi ) , $uto ) ;
}
} ) + ) * ) ?
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 ) ;
assert_eq! ( $part ( & input ) , $to ) ;
2022-11-29 12:29:49 +01:00
}
2022-11-29 12:56:07 +01:00
} ) + ) *
2022-11-29 12:29:49 +01:00
bench! ( part1 ( ) = = $b1 ) ;
bench! ( part2 ( ) = = $b2 ) ;
#[ 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 {
( $part : ident ( ) = = $expected :expr ) = > {
paste ::paste! {
#[ bench ]
fn [ < $part _bench > ] ( b : & mut test ::Bencher ) {
let raw = & read_file ( DAY ) ;
let input = parse_input ( & raw ) ;
b . iter ( | | assert_eq! ( $part ( test ::black_box ( & input ) ) , $expected ) ) ;
}
}
} ;
}