Re: case 5 and 6, AFAIK what is meant by "(not) optional" is that the values assigned to the arguments
are (not) optional. In other words, the additional processing is only invoked if the arguments are specified.
IOW: @ARGV = qw(--tag --ival) would be accepted for the ":" case, but not for the "=" case. And I note you specified ":" for both Case 5 & 6.
I also find your usage of Data::Dumper incomprehensible. Since you're using Test::More, I would prefer the is_deeply method of comparing complex structure.