text: ascii_only_false: {
      options = {}
      beautify = {
          ascii_only: false,
      }
      input: {
          console.log(
              "\x000\x001\x007\x008\x00",
              "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
              "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
              "\x20\x21\x22\x23 ... \x7d\x7e\x7f\x80\x81 ... \xfe\xff\u0fff\uffff"
          );
      }
      expect_exact: 'console.log("\\x000\\x001\\x007\\x008\\0","\\0\x01\x02\x03\x04\x05\x06\x07\\b\\t\\n\\v\\f\\r\x0e\x0f","\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",\' !"# ... }~\x7f\x80\x81 ... \xfe\xff\u0fff\uffff\');'
      expect_stdout: true
  }
  
  ascii_only_true: {
      options = {}
      beautify = {
          ascii_only: true,
      }
      input: {
          console.log(
              "\x000\x001\x007\x008\x00",
              "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
              "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
              "\x20\x21\x22\x23 ... \x7d\x7e\x7f\x80\x81 ... \xfe\xff\u0fff\uffff"
          );
      }
      expect_exact: 'console.log("\\x000\\x001\\x007\\x008\\0","\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\b\\t\\n\\v\\f\\r\\x0e\\x0f","\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f",\' !"# ... }~\\x7f\\x80\\x81 ... \\xfe\\xff\\u0fff\\uffff\');'
      expect_stdout: true
  }
  
  unicode_parse_variables: {
      options = {}
      input: {
          var a = {};
          a.你好 = 456;
  
          var ↂωↂ = 123;
          var l০ = 3; // 2nd char is a unicode digit
      }
      expect: {
          var a = {};
          a.你好 = 456;
  
          var ↂωↂ = 123;
          var l০ = 3;
      }
  }
  
  unicode_escaped_identifier: {
      input: {
          var \u0061 = "\ud800\udc00";
          console.log(a);
      }
      expect_exact: 'var a="\ud800\udc00";console.log(a);'
      expect_stdout: "\ud800\udc00"
  }
  
  unicode_identifier_ascii_only: {
      beautify = {
          ascii_only: true,
      }
      input: {
          var \u0061 = "testing \udbc4\udd11";
          var bar = "h\u0065llo";
          console.log(a, \u0062\u0061r);
      }
      expect_exact: 'var a="testing \\udbc4\\udd11";var bar="hello";console.log(a,bar);'
      expect_stdout: "testing \udbc4\udd11 hello"
  }
  
  unicode_string_literals: {
      beautify = {
          ascii_only: true,
      }
      input: {
          var a = "6 length unicode character: \udbc4\udd11";
          console.log(\u0061);
      }
      expect_exact: 'var a="6 length unicode character: \\udbc4\\udd11";console.log(a);'
      expect_stdout: "6 length unicode character: \udbc4\udd11"
  }
  
  check_escape_style: {
      beautify = {
          ascii_only: true,
      }
      input: {
          var a = "\x01";
          var \ua0081 = "\x10"; // \u0081 only in ID_Continue
          var \u0100 = "\u0100";
          var \u1000 = "\u1000";
          var \u1000 = "\ud800\udc00";
          var \u3f80 = "\udbc0\udc00";
          console.log(\u0061, \ua0081, \u0100, \u1000, \u3f80);
      }
      expect_exact: 'var a="\\x01";var \\ua0081="\\x10";var \\u0100="\\u0100";var \\u1000="\\u1000";var \\u1000="\\ud800\\udc00";var \\u3f80="\\udbc0\\udc00";console.log(a,\\ua0081,\\u0100,\\u1000,\\u3f80);'
      expect_stdout: "\u0001 \u0010 \u0100 \ud800\udc00 \udbc0\udc00"
  }
  
  escape_non_escaped_identifier: {
      beautify = {
          ascii_only: true,
      }
      input: {
          var µþ = "µþ";
          console.log(\u00b5þ);
      }
      expect_exact: 'var \\u00b5\\u00fe="\\xb5\\xfe";console.log(\\u00b5\\u00fe);'
      expect_stdout: "µþ"
  }
  
  non_escape_2_non_escape: {
      beautify = {
          ascii_only: false,
      }
      input: {
          var µþ = "µþ";
          console.log(\u00b5þ);
      }
      expect_exact: 'var µþ="µþ";console.log(µþ);'
      expect_stdout: "µþ"
  }
  
  issue_2242_1: {
      beautify = {
          ascii_only: false,
      }
      input: {
          console.log("\ud83d", "\ude00", "\ud83d\ude00", "\ud83d@\ude00");
      }
      expect_exact: 'console.log("\\ud83d","\\ude00","\ud83d\ude00","\\ud83d@\\ude00");'
      expect_stdout: "\ud83d \ude00 \ud83d\ude00 \ud83d@\ude00"
  }
  
  issue_2242_2: {
      beautify = {
          ascii_only: true,
      }
      input: {
          console.log("\ud83d", "\ude00", "\ud83d\ude00", "\ud83d@\ude00");
      }
      expect_exact: 'console.log("\\ud83d","\\ude00","\\ud83d\\ude00","\\ud83d@\\ude00");'
      expect_stdout: "\ud83d \ude00 \ud83d\ude00 \ud83d@\ude00"
  }
  
  issue_2242_3: {
      options = {
          evaluate: false,
      }
      input: {
          console.log("\ud83d" + "\ude00", "\ud83d" + "@" + "\ude00");
      }
      expect_exact: 'console.log("\\ud83d"+"\\ude00","\\ud83d"+"@"+"\\ude00");'
      expect_stdout: "\ud83d\ude00 \ud83d@\ude00"
  }
  
  issue_2242_4: {
      options = {
          evaluate: true,
      }
      input: {
          console.log("\ud83d" + "\ude00", "\ud83d" + "@" + "\ude00");
      }
      expect_exact: 'console.log("\ud83d\ude00","\\ud83d@\\ude00");'
      expect_stdout: "\ud83d\ude00 \ud83d@\ude00"
  }
  
  issue_2569: {
      input: {
          new RegExp("[\udc42-\udcaa\udd74-\udd96\ude45-\ude4f\udea3-\udecc]");
      }
      expect_exact: 'new RegExp("[\\udc42-\\udcaa\\udd74-\\udd96\\ude45-\\ude4f\\udea3-\\udecc]");'
  }
  
  surrogate_pair: {
      beautify = {
          ascii_only: false,
      }
      input: {
          var \u{2f800} = {
              \u{2f801}: "\u{100000}",
          };
          \u{2f800}.\u{2f802} = "\u{100001}";
          console.log(typeof \u{2f800}, \u{2f800}.\u{2f801}, \u{2f800}["\u{2f802}"]);
      }
      expect_exact: 'var \ud87e\udc00={"\ud87e\udc01":"\udbc0\udc00"};\ud87e\udc00.\ud87e\udc02="\udbc0\udc01";console.log(typeof \ud87e\udc00,\ud87e\udc00.\ud87e\udc01,\ud87e\udc00["\ud87e\udc02"]);'
      expect_stdout: "object \udbc0\udc00 \udbc0\udc01"
      node_version: ">=4"
  }
  
  surrogate_pair_ascii: {
      beautify = {
          ascii_only: true,
      }
      input: {
          var \u{2f800} = {
              \u{2f801}: "\u{100000}",
          };
          \u{2f800}.\u{2f802} = "\u{100001}";
          console.log(typeof \u{2f800}, \u{2f800}.\u{2f801}, \u{2f800}["\u{2f802}"]);
      }
      expect_exact: 'var \\u{2f800}={"\\ud87e\\udc01":"\\udbc0\\udc00"};\\u{2f800}.\\u{2f802}="\\udbc0\\udc01";console.log(typeof \\u{2f800},\\u{2f800}.\\u{2f801},\\u{2f800}["\\ud87e\\udc02"]);'
      expect_stdout: "object \udbc0\udc00 \udbc0\udc01"
      node_version: ">=4"
  }
  