> Remi Lespinet <[email protected]> writes: > > > I've some more tests, maybe I should put them all in this post ? > > Yes, please post as much as you have. Ideally, this should be > automatically tested, but if you don't have time to write the automated > tests, at least having a track of what you did on the list archives can > help someone else to do it.
It may not be easily readable without colors, so there are the scripts at the end. You can change the tested input by changing lines after the "cat >.tmplist" line in testall.sh. (There are two scripts testall.sh and testone.perl). Here are the tests results: Input: Split: M::A : Same : Yes ---------- Input: Jane Split: Jane M::A : Jane Same : Yes ---------- Input: [email protected] Split: [email protected] M::A : [email protected] Same : Yes ---------- Input: <[email protected]> Split: [email protected] M::A : [email protected] Same : Yes ---------- Input: Jane <[email protected]> Split: Jane <[email protected]> M::A : Jane <[email protected]> Same : Yes ---------- Input: Jane Doe <[email protected]> Split: Jane Doe <[email protected]> M::A : Jane Doe <[email protected]> Same : Yes ---------- Input: Jane\ Doe <[email protected]> Split: "Jane\ Doe" <[email protected]> M::A : "Jane \ Doe" <[email protected]> Same : No ---------- Input: "Jane" <[email protected]> Split: "Jane" <[email protected]> M::A : "Jane" <[email protected]> Same : Yes ---------- Input: "Doe, Jane" <[email protected]> Split: "Doe, Jane" <[email protected]> M::A : "Doe, Jane" <[email protected]> Same : Yes ---------- Input: "Doe, Ja"ne <[email protected]> Split: "Doe, Ja ne" <[email protected]> M::A : "Doe, Ja" ne <[email protected]> Same : No ---------- Input: "Doe, Katarina" Jane <[email protected]> Split: "Doe, Katarina Jane" <[email protected]> M::A : "Doe, Katarina" Jane <[email protected]> Same : No ---------- Input: "Jane@:;\>.,()<Doe" <[email protected]> Split: "Jane@:;\>.,()<Doe" <[email protected]> M::A : "Jane@:;\>.,()<Doe" <[email protected]> Same : Yes ---------- Input: Jane@:;\.,()<>Doe <[email protected]> Split: Jane@: : "\." : Doe <[email protected]> () M::A : Jane@: : \. : Doe <[email protected]> () Same : No ---------- Input: Jane!#$%&'*+-/=?^_{|}~Doe' <[email protected]> Split: Jane!#$%&'*+-/=?^_{|}~Doe' <[email protected]> M::A : Jane!#$%&'*+-/=?^_{|}~Doe' <[email protected]> Same : Yes ---------- Input: "<[email protected]>" Split: "<[email protected]>" M::A : "<[email protected]>" Same : Yes ---------- Input: "Jane [email protected]" Split: "Jane [email protected]" M::A : "Jane [email protected]" Same : Yes ---------- Input: Jane Doe <jdoe @ example.com > Split: Jane Doe <[email protected]> M::A : Jane Doe <[email protected]> Same : Yes ---------- Input: Jane Doe < [email protected] > Split: Jane Doe <[email protected]> M::A : Jane Doe <[email protected]> Same : Yes ---------- Input: Jane @ Doe @ Jane @ Doe Split: Jane@Doe@Jane@Doe M::A : Jane@Doe@Jane@Doe Same : Yes ---------- Input: Jane [email protected] Split: [email protected] M::A : Jane : [email protected] Same : No ---------- Input: <[email protected]> Jane Doe Split: [email protected] M::A : Jane Doe <[email protected]> Same : No ---------- Input: Jane <[email protected]> Doe Split: Jane <[email protected]> M::A : Jane Doe <[email protected]> Same : No ---------- Input: "Jane, 'Doe'" <[email protected]> Split: "Jane, 'Doe'" <[email protected]> M::A : "Jane, 'Doe'" <[email protected]> Same : Yes ---------- Input: 'Doe, "Jane' <[email protected]> Split: 'Doe : " Jane' <[email protected]> M::A : 'Doe : " Jane' <[email protected]> Same : Yes ---------- Input: "Jane" "Do"e <[email protected]> Split: "Jane" "Do" e <[email protected]> M::A : "Jane" "Do" e <[email protected]> Same : Yes ---------- Input: "Jane' Doe" <[email protected]> Split: "Jane' Doe" <[email protected]> M::A : "Jane' Doe" <[email protected]> Same : Yes ---------- Input: "Jane Doe <[email protected]>" <[email protected]> Split: "Jane Doe <[email protected]>" <[email protected]> M::A : "Jane Doe <[email protected]>" <[email protected]> Same : Yes ---------- Input: "Jane\" Doe" <[email protected]> Split: "Jane\" Doe" <[email protected]> M::A : "Jane\" Doe" <[email protected]> Same : Yes ---------- Input: Doe, jane <[email protected]> Split: Doe : jane <[email protected]> M::A : Doe : jane <[email protected]> Same : Yes ---------- Input: "Jane Doe <[email protected]> Split: " Jane Doe <[email protected]> M::A : " Jane Doe <[email protected]> Same : Yes ---------- Input: "Jane "Kat"a" ri"na" ",Doe" <[email protected]> Split: "Jane Kat a ri na ,Doe" <[email protected]> M::A : "Jane " Kat "a" ri "na" ",Doe" <[email protected]> Same : No ---------- Input: Jane Doe Split: Jane Doe M::A : Jane : Doe Same : No ---------- Input: Jane "Doe <[email protected]>" Split: "Jane Doe <[email protected]>" M::A : Jane : "Doe <[email protected]>" Same : No ---------- Input: \"Jane Doe <[email protected]> Split: "\"Jane Doe" <[email protected]> M::A : \ " Jane Doe <[email protected]> Same : No ---------- Input: Jane\"\" Doe <[email protected]> Split: "Jane\"\" Doe" <[email protected]> M::A : Jane \ " \ " Doe <[email protected]> Same : No ---------- Input: 'Jane 'Doe' <[email protected]> Split: 'Jane 'Doe' <[email protected]> M::A : 'Jane 'Doe' <[email protected]> Same : Yes ---------- Input: 'Jane "Katarina\" \' Doe' <[email protected]> Split: "'Jane Katarina\" \' Doe'" <[email protected]> M::A : 'Jane " Katarina \ " \ ' Doe' <[email protected]> Same : No ********************************************************************** * SCRIPTS PART * ********************************************************************** ---------------------------- testall.sh ---------------------------- #!/bin/sh cat >.tmplist <<EOF Jane [email protected] <[email protected]> Jane <[email protected]> Jane Doe <[email protected]> Jane\ Doe <[email protected]> "Jane" <[email protected]> "Doe, Jane" <[email protected]> "Doe, Ja"ne <[email protected]> "Doe, Katarina" Jane <[email protected]> "Jane@:;\>.,()<Doe" <[email protected]> Jane@:;\.,()<>Doe <[email protected]> Jane!#$%&'*+-/=?^_{|}~Doe' <[email protected]> "<[email protected]>" "Jane [email protected]" Jane Doe <jdoe @ example.com > Jane Doe < [email protected] > Jane @ Doe @ Jane @ Doe Jane [email protected] <[email protected]> Jane Doe Jane <[email protected]> Doe "Jane, 'Doe'" <[email protected]> 'Doe, "Jane' <[email protected]> "Jane" "Do"e <[email protected]> "Jane' Doe" <[email protected]> "Jane Doe <[email protected]>" <[email protected]> "Jane\" Doe" <[email protected]> Doe, jane <[email protected]> "Jane Doe <[email protected]> "Jane "Kat"a" ri"na" ",Doe" <[email protected]> Jane Doe Jane "Doe <[email protected]>" \"Jane Doe <[email protected]> Jane\"\" Doe <[email protected]> 'Jane 'Doe' <[email protected]> 'Jane "Katarina\" \' Doe' <[email protected]> EOF cat .tmplist | while read -r line do echo "Input: $line" ./testone.perl "$line" echo ---------- done ---------------------------- testone.perl ---------------------------- #!/usr/bin/perl use strict; use warnings; use Term::ANSIColor; use Mail::Address; use Text::ParseWords; my $string = $ARGV[0]; sub split_addrs { my $re_comment = qr/\((?:[^)]*)\)/; my $re_quote = qr/"(?:[^\"\\]|\\.)*"/; my $re_word = qr/(?:[^]["\s()<>:;@\\,.]|\\.)+/; my $re_token = qr/(?:$re_quote|$re_word|$re_comment|\S)/; my @tokens = map { $_ =~ /\s*($re_token)\s*/g } @_; push @tokens, ","; my (@addr_list, @phrase, @address, @comment, @buffer) = (); foreach my $token (@tokens) { if ($token =~ /^[,;]$/) { if (@address) { push @address, @buffer; } else { push @phrase, @buffer; } my $str_phrase = join ' ', @phrase; my $str_address = join '', @address; my $str_comment = join ' ', @comment; if ($str_phrase =~ /[][()<>:;@\\,.\000-\037\177]/) { $str_phrase =~ s/(^|[^\\])"/$1/g; $str_phrase = qq["$str_phrase"]; } if ($str_address ne "" && $str_phrase ne "") { $str_address = qq[<$str_address>]; } my $str_mailbox = "$str_phrase $str_address $str_comment"; $str_mailbox =~ s/^\s*|\s*$//g; push @addr_list, $str_mailbox if ($str_mailbox); @phrase = @address = @comment = @buffer = (); } elsif ($token =~ /^\(/) { push @comment, $token; } elsif ($token eq "<") { push @phrase, (splice @address), (splice @buffer); } elsif ($token eq ">") { push @address, (splice @buffer); } elsif ($token eq "@") { push @address, (splice @buffer), "@"; } elsif ($token eq ".") { push @address, (splice @buffer), "."; } else { push @buffer, $token; } } return @addr_list; } sub old_split { quotewords('\s*,\s*', 1, $_[0]); } my @tab = split_addrs($string); my @ref = map { $_->format } Mail::Address->parse($string); # my @old = old_split($string); #can be printed to see the difference my $tabstring = join "\n", @tab; my $refstring = join "\n", @ref; my $same = ($tabstring eq $refstring); $tabstring =~ s/\n/\n : /g; $refstring =~ s/\n/\n : /g; print color 'bold yellow'; print "Split: ", "$tabstring", "\n"; print color 'bold blue'; print "M::A : ", "$refstring", "\n"; if ($same) { print color 'bold green'; print "Same : ", "Yes", "\n"; } else { print color 'bold red'; print "Same : ", "No", "\n"; } print color 'reset'; -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html

