Test::DifferencesでUTF-8文字列をエスケープせずに出力する方法

ドキュメントに書いてある、 Text::Diff の設定をどうこうする方法では駄目だったのでいろいろ調べた感じ、以下のようにすれば行けた。

use strict;
use warnings;
use utf8;

use Data::Dumper;
{
    package Data::Dumper;

    our $Useperl = 1;

    no warnings 'redefine';

    sub qquote {
        shift;
    }
}

use Term::Encoding qw(term_encoding);
use Test::More;
{
    my $builder       = Test::More->builder;
    my $term_encoding = term_encoding;

    binmode $builder->output,         ":encoding($term_encoding)";
    binmode $builder->failure_output, ":encoding($term_encoding)";
    binmode $builder->todo_output,    ":encoding($term_encoding)";
}

use Text::Diff::Config;
$Text::Diff::Config::Output_Unicode = 1;

use Test::Differences;
eq_or_diff 'あいうえお', 'かきくけこ';
done_testing;

Data::Dumperがまず問題

Test::Differences では内部的に Data::Dumper を使用しており、そこで確実にエスケープされてしまうので、まずはその対処をしなければならない。

これはまともな方法ではどうにもならないので、以下のページを参考に qquote() をハックする方法で対処した。

Data::DumperでUTF-8フラグつき文字列をエスケープさせないようにするには - ku

Test::Moreの出力をなんとかしないと、 Wide character in print... が出ます

これはいつものアレ。最近 Test::More も中身が Test2 になったりしてるみたいでよくわからないが、まだこのやり方でとりあえず通用した。

Test::Moreでマルチバイト文字列を出力する可能性がある場合。 - 遠い叫び

Text::Diffの設定をなんとかする

$Text::Diff::Config::Output_Unicode を真にするだけ。なおこの設定、table_diff 以外では不要なので、 unified_diff とかを使う場合はなくてもよい。

Test::Differences使わない方がいいんじゃないか説

あまりちゃんとメンテされてない感じだし、使わなくて済むならそうした方がいいかも。今は似たようなのでもっといいのあるんじゃない?