use strict; use warnings; use open ':std', ':encoding(utf8)'; use utf8; my $module = $ENV{EXERCISM} ? 'Example' : 'Bob'; use Test::More; my @cases = map { { input => $_->[0], expect => $_->[1], desc => $_->[2], } } ( # input expected output title ['Tom-ay-to, tom-aaaah-to.', 'Whatever.', 'stating something'], ['WATCH OUT!', 'Whoa, chill out!', 'shouting'], ['Does this cryogenic chamber make me look fat?', 'Sure.', 'question'], ['You are, what, like 15?', 'Sure.', 'numeric question'], ["Let's go make out behind the gym!", 'Whatever.', 'talking forcefully'], ["It's OK if you don't want to go to the DMV.", 'Whatever.', 'using acronyms in regular speech'], ['WHAT THE HELL WERE YOU THINKING?', 'Whoa, chill out!', 'forceful questions'], ['1, 2, 3 GO!', 'Whoa, chill out!', 'shouting numbers'], ['1, 2, 3', 'Whatever.', 'only numbers'], ['4?', 'Sure.', 'question with only numbers'], ['ZOMG THE %^*@#$(*^ ZOMBIES ARE COMING!!11!!1!', 'Whoa, chill out!', 'shouting with special characters'], ["ÜMLÄÜTS!", 'Whoa, chill out!', 'shouting with umlauts'], ["\xdcML\xc4\xdcTS!", 'Whoa, chill out!', 'shouting with umlauts'], ['_A', 'Whoa, chill out!', 'underscore shout - before'], ['A_', 'Whoa, chill out!', 'underscore shout - after'], ['$A', 'Whoa, chill out!', 'Dollar sign shout - before'], ['A$', 'Whoa, chill out!', 'Dollar sign shout - after'], ["ÜMLäÜTS!", 'Whatever.', 'speaking calmly with umlauts'], ['I HATE YOU', 'Whoa, chill out!', 'shouting with no exclamation mark'], ['Ending with ? means a question.', 'Whatever.', 'statement containing question mark'], ["Wait! Hang on. Are you going to be OK?", 'Sure.', 'prattling on'], ['', 'Fine. Be that way!', 'silence'], [' ', 'Fine. Be that way!', 'prolonged silence'], [" \nI just remembered...", 'Whatever.', 'Silence, then more'], ); ok -e "$module.pm", "missing $module.pm" or BAIL_OUT("You need to create a module called $module.pm with a function called hey() that gets one parameter: The text Bob hears."); use_ok($module) or BAIL_OUT("Does $module.pm compile? Does it end with 1; ?"); can_ok($module, 'hey') or BAIL_OUT("Missing package $module; or missing sub hey()"); my $sub = $module->can('hey'); foreach my $c (@cases) { #diag uc $c->{input}; my $title = $c->{desc} ? "$c->{desc}: $c->{input}" : $c->{input}; is $sub->( $c->{input} ), $c->{expect}, $title; } done_testing();