summaryrefslogtreecommitdiffstats
path: root/intl/uconv/tests/unit/test_bug563618.js
blob: 2fa077034495d63a31420a5253cc54929f9f9fac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/* Test case for bug 563618
 *
 * Uses nsIConverterInputStream to decode invalid EUC-JP text
 *
 */

const { NetUtil } = ChromeUtils.import("resource://gre/modules/NetUtil.jsm");

const test = [
  // 0: 0x8e followed by hi byte, not valid JIS X 0201
  [
    "abcdefghijklmnopqrstuvwxyz12test00%8e%80foobar",
    //    expected: one replacement character, invalid byte eaten
    "abcdefghijklmnopqrstuvwxyz12test00\uFFFDfoobar",
  ],
  // 1: 0x8e followed by ASCII
  [
    "abcdefghijklmnopqrstuvwxyz12test01%8efoobar",
    //    expected: one replacement character, invalid byte not eaten
    "abcdefghijklmnopqrstuvwxyz12test01\uFFFDfoobar",
  ],
  // 2: JIS X 0208 lead byte followed by invalid hi byte
  [
    "abcdefghijklmnopqrstuvwxyz12test02%bf%80foobar",
    //    expected: one replacement character, invalid byte eaten
    "abcdefghijklmnopqrstuvwxyz12test02\uFFFDfoobar",
  ],
  // 3: JIS X 0208 lead byte followed by ASCII
  [
    "abcdefghijklmnopqrstuvwxyz12test03%bffoobar",
    //    expected: one replacement character, invalid byte not eaten
    "abcdefghijklmnopqrstuvwxyz12test03\uFFFDfoobar",
  ],
];

const ConverterInputStream = Components.Constructor(
  "@mozilla.org/intl/converter-input-stream;1",
  "nsIConverterInputStream",
  "init"
);

function testCase(testText, expectedText, bufferLength, charset) {
  var dataURI = "data:text/plain;charset=" + charset + "," + testText;
  var channel = NetUtil.newChannel({
    uri: dataURI,
    loadUsingSystemPrincipal: true,
  });
  var testInputStream = channel.open();
  var testConverter = new ConverterInputStream(
    testInputStream,
    charset,
    bufferLength,
    0xfffd
  );

  if (!(testConverter instanceof Ci.nsIUnicharLineInputStream)) {
    throw new Error("not line input stream");
  }

  var outStr = "";
  var more;
  do {
    // read the line and check for eof
    var line = {};
    more = testConverter.readLine(line);
    outStr += line.value;
  } while (more);

  if (outStr != expectedText) {
    dump("Failed with bufferLength = " + bufferLength + "\n");
    if (outStr.length == expectedText.length) {
      for (let i = 0; i < outStr.length; ++i) {
        if (outStr.charCodeAt(i) != expectedText.charCodeAt(i)) {
          dump(
            i +
              ": " +
              outStr.charCodeAt(i).toString(16) +
              " != " +
              expectedText.charCodeAt(i).toString(16) +
              "\n"
          );
        }
      }
    }
  }

  // escape the strings before comparing for better readability
  Assert.equal(escape(outStr), escape(expectedText));
}

function run_test() {
  for (var i = 0; i < test.length; ++i) {
    for (var bufferLength = 32; bufferLength < 40; ++bufferLength) {
      testCase(test[i][0], test[i][1], bufferLength, "EUC-JP");
    }
  }
}