######################################################################
#
# 9029_cheatsheet_ur.t
#
# Copyright (c) 2026 INABA Hitoshi <ina@cpan.org> in a CPAN
#
# Jacode4e::RoundTrip فوری حوالہ (اردو)
# یہ ٹیسٹ اردو زبان کے صارفین کے لیے فوری حوالہ کے طور پر بھی کام کرتا ہے۔
######################################################################

# یہ فائل UTF-8 میں انکوڈ کی گئی ہے۔
die "This file is not encoded in UTF-8.\n" if 'あ' ne "\xe3\x81\x82";
die "This script is for perl only. You are using $^X.\n" if $^X =~ /jperl/i;

use strict;
use FindBin;
use lib "$FindBin::Bin/../lib";

# ======================================================================
# Jacode4e::RoundTrip فوری حوالہ (اردو)
# ======================================================================
#
# [بنیادی استعمال]
#
#   use FindBin;
#   use lib "$FindBin::Bin/lib";
#   use Jacode4e::RoundTrip;
#
#   $char_count = Jacode4e::RoundTrip::convert(\$line, $OUTPUT_encoding, $INPUT_encoding);
#   $char_count = Jacode4e::RoundTrip::convert(\$line, $OUTPUT_encoding, $INPUT_encoding, { %option });
#
#   $line             : تبدیل کی جانے والی سٹرنگ (حوالہ کے ذریعے بھیجی گئی، جگہ پر لکھی جاتی ہے)
#   $OUTPUT_encoding  : آؤٹ پٹ انکوڈنگ کا نام
#   $INPUT_encoding   : ان پٹ انکوڈنگ کا نام
#   $char_count       : تبدیلی کے بعد حروف کی تعداد
#
# [انکوڈنگ ناموں کی فہرست]
#
#   مختصر نام   معنی
#   ----------   ---------------------------------------------------
#   cp932x       CP932X (JIS X 0213 تک توسیع، واحد شفٹ 0x9C5A)
#   cp932        Microsoft CP932 (Windows-31J / IANA رجسٹرڈ نام)
#   cp932ibm     IBM CP932
#   cp932nec     NEC CP932
#   sjis2004     JISC Shift_JIS-2004
#   cp00930      IBM CP00930 (CP00290+CP00300, CCSID 5026 کاتاکانا)
#   keis78       HITACHI KEIS78
#   keis83       HITACHI KEIS83
#   keis90       HITACHI KEIS90
#   jef          FUJITSU JEF (12pt، شفٹ کوڈز کے لیے OUTPUT_SHIFTING استعمال کریں)
#   jef9p        FUJITSU JEF ( 9pt، شفٹ کوڈز کے لیے OUTPUT_SHIFTING استعمال کریں)
#   jipsj        NEC JIPS(J)
#   jipse        NEC JIPS(E)
#   letsj        UNISYS LetsJ
#   utf8         UTF-8.0 (عام UTF-8)
#   utf8.1       UTF-8.1 (CP932 نہیں، Shift_JIS-Unicode میپنگ پر مبنی تبدیلی)
#   utf8jp       UTF-8-SPUA-JP (JIS X 0213 کو Unicode SPUA پر نقشہ بند کیا گیا)
#
# [اختیارات]
#
#   کلید              قدر / تفصیل
#   ---------------   ---------------------------------------------------
#   INPUT_LAYOUT      ان پٹ ریکارڈ ترتیب ('S'=SBCS, 'D'=DBCS)
#   OUTPUT_SHIFTING   اگر درست ہو تو آؤٹ پٹ میں DBCS ترتیب کے گرد شفٹ کوڈ شامل کریں
#   SPACE             DBCS/MBCS اسپیس کوڈ (بائنری سٹرنگ)
#   GETA             نقشہ نہ ہو سکنے والے حروف کے لیے گیٹا علامت
#   OVERRIDE_MAPPING  فی حرف متبادل { "\x12\x34"=>"\x56\x78" }
#
# [انتباہ: دو طرفہ تبدیلی]
#
#   نقصاندہ تبدیلیاں موجود ہیں (مثلاً CP932 میں 398 ناقابل واپسی میپنگ ہیں)۔
# [Jacode4e اور Jacode4e::RoundTrip میں فرق]
#
#   Jacode4e              : تیز یک طرفہ تبدیلی۔ کچھ حروف کے لیے نقصاندہ
#                           (مثلاً CP932 میں 398 ناقابل واپسی میپنگ ہیں)۔
#   Jacode4e::RoundTrip   : Unicode محور کے ذریعے دو طرفہ وفاداری کی ضمانت۔
#                           A->B->A ہمیشہ یکساں۔ Jacode4e سے سست،
#                           لیکن جب ڈیٹا کو آنا جانا ہو تو یہ استعمال کریں۔
#
#   اگر دو طرفہ تبدیلی کی ضرورت نہ ہو تو Jacode4e ماڈیول استعمال کریں۔
#
# ======================================================================

BEGIN {
    use vars qw(@test);
    @test = (
        ["\x81\x40", 'jef',    'cp932', {},                    "\xA1\xA1", 'cp932(8140)->jef(A1A1)'],
        ["\x81\x40", 'keis83', 'cp932', {},                    "\xA1\xA1", 'cp932(8140)->keis83(A1A1)'],
        ["\x81\x40", 'jipsj',  'cp932', {},                    "\x21\x21", 'cp932(8140)->jipsj(2121)'],
        ["\x81\x40", 'utf8',   'cp932', {},                    "\xE3\x80\x80", 'cp932(8140)->utf8(E38080)'],
        ["\x81\x40", 'jef',    'cp932', {'SPACE'=>"\x40\x40"}, "\x40\x40", 'cp932(8140)->jef SPACE=4040'],
        ["\xFC\xFC", 'jef',    'cp932', {'GETA'=>"\xFE\xFE"},  "\xFE\xFE", 'cp932(FCFC)->jef GETA=FEFE'],
        ["\x81\x40\x31", 'jef', 'cp932', {'OUTPUT_SHIFTING'=>1}, "\x28\xA1\xA1\x29\xF1",
            'cp932(814031)->jef OUTPUT_SHIFTING(28A1A129F1)'],
        ["\xA1\xA1\xF1", 'cp932', 'jef', {'INPUT_LAYOUT'=>'DS'}, "\x81\x40\x31",
            'jef(A1A1F1) INPUT_LAYOUT=DS->cp932(814031)'],
        ["\x81\x40", 'cp00930', 'cp932', {}, "\x40\x40", 'cp932(8140)->cp00930 بغیر شفٹ(4040)'],
        ["\x81\x40\x31", 'cp00930', 'cp932', {'OUTPUT_SHIFTING'=>1}, "\x0E\x40\x40\x0F\xF1",
            'cp932(814031)->cp00930 OUTPUT_SHIFTING(0E40400FF1)'],
        ["\x81\x40\x31", 'keis83', 'cp932', {}, "\xA1\xA1\xF1",
            'cp932(814031)->keis83 بغیر شفٹ(A1A1F1)'],
        ["\x81\x40\x31", 'keis83', 'cp932', {'OUTPUT_SHIFTING'=>1}, "\x0A\x42\xA1\xA1\x0A\x41\xF1",
            'cp932(814031)->keis83 OUTPUT_SHIFTING(0A42A1A10A41F1)'],
        ["\x81\x60", 'utf8', 'cp932', {'INPUT_LAYOUT'=>'D'}, "\xE3\x80\x9C",
            'cp932(8160 لہر ڈیش)->utf8(E3809C U+301C)'],
        # utf8 vs utf8.1: cp932(815C/8161/817C) differ between MS-CP932 and JIS-Shift_JIS mapping
        # cp932(815C)=― : utf8->U+2015 HORIZONTAL BAR, utf8.1->U+2014 EM DASH
        ["\x81\x5C", 'utf8',   'cp932', {'INPUT_LAYOUT'=>'D'}, "\xE2\x80\x95", 'cp932(815C)->utf8(E28095 U+2015 HORIZONTAL BAR)'],
        ["\x81\x5C", 'utf8.1', 'cp932', {'INPUT_LAYOUT'=>'D'}, "\xE2\x80\x94", 'cp932(815C)->utf8.1(E28094 U+2014 EM DASH)'],
        # cp932(8161)=∥ : utf8->U+2225 PARALLEL TO, utf8.1->U+2016 DOUBLE VERTICAL LINE
        ["\x81\x61", 'utf8',   'cp932', {'INPUT_LAYOUT'=>'D'}, "\xE2\x88\xA5", 'cp932(8161)->utf8(E288A5 U+2225 PARALLEL TO)'],
        ["\x81\x61", 'utf8.1', 'cp932', {'INPUT_LAYOUT'=>'D'}, "\xE2\x80\x96", 'cp932(8161)->utf8.1(E28096 U+2016 DOUBLE VERTICAL LINE)'],
        # cp932(817C)=－ : utf8->U+FF0D FULLWIDTH HYPHEN-MINUS, utf8.1->U+2212 MINUS SIGN
        ["\x81\x7C", 'utf8',   'cp932', {'INPUT_LAYOUT'=>'D'}, "\xEF\xBC\x8D", 'cp932(817C)->utf8(EFBC8D U+FF0D FULLWIDTH HYPHEN-MINUS)'],
        ["\x81\x7C", 'utf8.1', 'cp932', {'INPUT_LAYOUT'=>'D'}, "\xE2\x88\x92", 'cp932(817C)->utf8.1(E28892 U+2212 MINUS SIGN)'],
        # cp932x(9C5A815C/8161/817C): utf8/utf8.1 mapping is inverted compared to cp932
        ["\x9C\x5A\x81\x5C", 'utf8',   'cp932x', {}, "\xE2\x80\x94", 'cp932x(9C5A815C)->utf8(E28094 U+2014 EM DASH)'],
        ["\x9C\x5A\x81\x5C", 'utf8.1', 'cp932x', {}, "\xE2\x80\x95", 'cp932x(9C5A815C)->utf8.1(E28095 U+2015 HORIZONTAL BAR)'],
        ["\x9C\x5A\x81\x61", 'utf8',   'cp932x', {}, "\xE2\x80\x96", 'cp932x(9C5A8161)->utf8(E28096 U+2016 DOUBLE VERTICAL LINE)'],
        ["\x9C\x5A\x81\x61", 'utf8.1', 'cp932x', {}, "\xE2\x88\xA5", 'cp932x(9C5A8161)->utf8.1(E288A5 U+2225 PARALLEL TO)'],
        ["\x9C\x5A\x81\x7C", 'utf8',   'cp932x', {}, "\xE2\x88\x92", 'cp932x(9C5A817C)->utf8(E28892 U+2212 MINUS SIGN)'],
        ["\x9C\x5A\x81\x7C", 'utf8.1', 'cp932x', {}, "\xEF\xBC\x8D", 'cp932x(9C5A817C)->utf8.1(EFBC8D U+FF0D FULLWIDTH HYPHEN-MINUS)'],
        ["\x81\x40", 'utf8jp', 'cp932', {}, "\xF3\xB0\x84\x80",
            'cp932(8140)->utf8jp(F3B08480 SPUA)'],
    );
    $|=1;
    print "1..",scalar(@test),"\n";
    my $testno=1;
    sub ok { print $_[0]?'ok ':'not ok ',$testno++,$_[1]?" - $_[1]\n":"\n" }
}

use Jacode4e::RoundTrip;

for my $test (@test) {
    my($give,$OUTPUT_encoding,$INPUT_encoding,$option,$want,$desc) = @{$test};
    my $got = $give;
    my $return = Jacode4e::RoundTrip::convert(\$got,$OUTPUT_encoding,$INPUT_encoding,$option);
    ok(($return > 0) and ($got eq $want),
        sprintf('%s => return=%d got=(%s) want=(%s)',
            $desc, $return,
            uc unpack('H*',$got),
            uc unpack('H*',$want),
        )
    );
}

__END__
