# Global Metrics

path: .metrics.cognitive.average
old: null
new: 0.1111111111111111
path: .metrics.halstead.volume
old: 381.55971309377543
new: 9415.0
path: .metrics.halstead.N1
old: 37.0
new: 751.0
path: .metrics.halstead.N2
old: 38.0
new: 594.0
path: .metrics.halstead.vocabulary
old: 34.0
new: 128.0
path: .metrics.halstead.n2
old: 27.0
new: 114.0
path: .metrics.halstead.length
old: 75.0
new: 1345.0
path: .metrics.halstead.level
old: 0.2030075187969925
new: 0.027417027417027416
path: .metrics.halstead.n1
old: 7.0
new: 14.0
path: .metrics.halstead.time
old: 104.41860461208256
new: 19077.763157894737
path: .metrics.halstead.difficulty
old: 4.925925925925926
new: 36.473684210526315
path: .metrics.halstead.bugs
old: 0.050766708387169186
new: 1.6346020928227711
path: .metrics.halstead.effort
old: 1879.5348830174864
new: 343399.7368421053
path: .metrics.halstead.estimated_program_length
old: 148.03344701281688
new: 832.2524305235869
path: .metrics.halstead.purity_ratio
old: 1.973779293504225
new: 0.6187750412814772
path: .metrics.loc.cloc
old: 21.0
new: 34.0
path: .metrics.loc.blank
old: 12.0
new: 26.0
path: .metrics.loc.lloc
old: 0.0
new: 102.0
path: .metrics.loc.ploc
old: 28.0
new: 177.0
path: .metrics.loc.sloc
old: 61.0
new: 237.0
path: .metrics.cyclomatic.sum
old: 7.0
new: 11.0
path: .metrics.cyclomatic.average
old: 1.4
new: 1.1
path: .metrics.nargs.average
old: null
new: 2.0
path: .metrics.nargs.sum
old: 0.0
new: 18.0
path: .metrics.nom.functions
old: 0.0
new: 9.0
path: .metrics.nom.total
old: 0.0
new: 9.0
path: .metrics.mi.mi_original
old: 71.88365312658684
new: 32.30711661993635
path: .metrics.mi.mi_visual_studio
old: 42.03722405063557
new: 18.89305065493354
path: .metrics.mi.mi_sei
old: 68.16168656206915
new: -0.2876382136774325
path: .metrics.nexits.average
old: null
new: 0.0

# Spaces Data

## Minimal test - lines (105, 121)

path: .spaces[2].metrics.nexits.average
old: null
new: 0.0
path: .spaces[2].metrics.mi.mi_sei
old: 119.97629276875443
new: 75.71971753504829
path: .spaces[2].metrics.mi.mi_original
old: 135.56248504247483
new: 92.16844033089887
path: .spaces[2].metrics.mi.mi_visual_studio
old: 79.27630704238294
new: 53.899672708128
path: .spaces[2].metrics.cognitive.average
old: null
new: 0.0
path: .spaces[2].metrics.loc.ploc
old: 4.0
new: 16.0
path: .spaces[2].metrics.loc.sloc
old: 4.0
new: 17.0
path: .spaces[2].metrics.loc.cloc
old: 0.0
new: 1.0
path: .spaces[2].metrics.loc.lloc
old: 0.0
new: 10.0
path: .spaces[2].metrics.nom.functions
old: 0.0
new: 1.0
path: .spaces[2].metrics.nom.total
old: 0.0
new: 1.0
path: .spaces[2].metrics.halstead.length
old: 5.0
new: 116.0
path: .spaces[2].metrics.halstead.vocabulary
old: 5.0
new: 25.0
path: .spaces[2].metrics.halstead.bugs
old: 0.00170906242423416
new: 0.1018623574555468
path: .spaces[2].metrics.halstead.estimated_program_length
old: 6.754887502163468
new: 94.71013448036484
path: .spaces[2].metrics.halstead.purity_ratio
old: 1.3509775004326936
new: 0.8164666765548694
path: .spaces[2].metrics.halstead.difficulty
old: 1.0
new: 9.916666666666666
path: .spaces[2].metrics.halstead.effort
old: 11.60964047443681
new: 5341.982570304191
path: .spaces[2].metrics.halstead.N1
old: 2.0
new: 65.0
path: .spaces[2].metrics.halstead.N2
old: 3.0
new: 51.0
path: .spaces[2].metrics.halstead.level
old: 1.0
new: 0.10084033613445378
path: .spaces[2].metrics.halstead.time
old: 0.6449800263576005
new: 296.77680946134393
path: .spaces[2].metrics.halstead.n2
old: 3.0
new: 18.0
path: .spaces[2].metrics.halstead.n1
old: 2.0
new: 7.0
path: .spaces[2].metrics.halstead.volume
old: 11.60964047443681
new: 538.687318013868
path: .spaces[2].metrics.nargs.sum
old: 0.0
new: 2.0
path: .spaces[2].metrics.nargs.average
old: null
new: 2.0

### Code

    TEST(TextFormatterTestMismatch, format_d)
    {
      nsString out;
      // just for completeness, this is our format, and works
      nsTextFormatter::ssprintf(out, u"%d", int(-1));
      EXPECT_STREQ("-1", NS_ConvertUTF16toUTF8(out).get());
      nsTextFormatter::ssprintf(out, u"%d", uint32_t(-1));
      EXPECT_STREQ("4294967295", NS_ConvertUTF16toUTF8(out).get());
    #ifndef DEBUG
      nsTextFormatter::ssprintf(out, u"%d", float(3.5));
      EXPECT_STREQ("3.5", NS_ConvertUTF16toUTF8(out).get());
      nsTextFormatter::ssprintf(out, u"%d", "foo");
      EXPECT_STREQ("foo", NS_ConvertUTF16toUTF8(out).get());
      nsTextFormatter::ssprintf(out, u"%d", u"foo");
      EXPECT_STREQ("foo", NS_ConvertUTF16toUTF8(out).get());
    #endif
    }

## Minimal test - lines (10, 47)

path: .spaces[0].metrics.mi.mi_original
old: null
new: 73.0906005818299
path: .spaces[0].metrics.mi.mi_visual_studio
old: null
new: 42.74304127592392
path: .spaces[0].metrics.mi.mi_sei
old: null
new: 51.03371083843999
path: .spaces[0].metrics.cognitive.sum
old: 0.0
new: 1.0
path: .spaces[0].metrics.cognitive.average
old: null
new: 1.0
path: .spaces[0].metrics.nom.functions
old: 0.0
new: 1.0
path: .spaces[0].metrics.nom.total
old: 0.0
new: 1.0
path: .spaces[0].metrics.loc.ploc
old: 1.0
new: 28.0
path: .spaces[0].metrics.loc.cloc
old: 0.0
new: 3.0
path: .spaces[0].metrics.loc.lloc
old: 0.0
new: 11.0
path: .spaces[0].metrics.loc.blank
old: 0.0
new: 7.0
path: .spaces[0].metrics.loc.sloc
old: 1.0
new: 38.0
path: .spaces[0].metrics.cyclomatic.average
old: 1.0
new: 2.0
path: .spaces[0].metrics.cyclomatic.sum
old: 1.0
new: 2.0
path: .spaces[0].metrics.halstead.estimated_program_length
old: null
new: 380.5804471432244
path: .spaces[0].metrics.halstead.length
old: 1.0
new: 269.0
path: .spaces[0].metrics.halstead.volume
old: 0.0
new: 1648.777131558196
path: .spaces[0].metrics.halstead.difficulty
old: 0.0
new: 13.342105263157896
path: .spaces[0].metrics.halstead.n2
old: 1.0
new: 57.0
path: .spaces[0].metrics.halstead.n1
old: 0.0
new: 13.0
path: .spaces[0].metrics.halstead.time
old: 0.0
new: 1222.119891374277
path: .spaces[0].metrics.halstead.N1
old: 0.0
new: 152.0
path: .spaces[0].metrics.halstead.N2
old: 1.0
new: 117.0
path: .spaces[0].metrics.halstead.purity_ratio
old: null
new: 1.4147972012759271
path: .spaces[0].metrics.halstead.bugs
old: 0.0
new: 0.2616995387610926
path: .spaces[0].metrics.halstead.vocabulary
old: 1.0
new: 70.0
path: .spaces[0].metrics.halstead.level
old: null
new: 0.07495069033530571
path: .spaces[0].metrics.halstead.effort
old: 0.0
new: 21998.158044736985
path: .spaces[0].metrics.nargs.average
old: null
new: 2.0
path: .spaces[0].metrics.nargs.sum
old: 0.0
new: 2.0
path: .spaces[0].metrics.nexits.average
old: null
new: 0.0

### Code

    TEST(TextFormatter, Tests)
    {
      nsAutoString fmt(u"%3$s %4$S %1$d %2$d %2$d %3$s"_ns);
      char utf8[] = "Hello";
      char16_t ucs2[] = {'W',    'o',    'r',    'l',    'd',
                         0x4e00, 0xAc00, 0xFF45, 0x0103, 0x00};
      int d = 3;

      char16_t buf[256];
      nsTextFormatter::snprintf(buf, 256, fmt.get(), d, 333, utf8, ucs2);
      nsAutoString out(buf);

      const char16_t* uout = out.get();
      const char16_t expected[] = {
          0x48,   0x65,   0x6C,   0x6C,   0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64,
          0x4E00, 0xAC00, 0xFF45, 0x0103, 0x20, 0x33, 0x20, 0x33, 0x33, 0x33, 0x20,
          0x33,   0x33,   0x33,   0x20,   0x48, 0x65, 0x6C, 0x6C, 0x6F};

      for (uint32_t i = 0; i < out.Length(); i++) {
        ASSERT_EQ(uout[i], expected[i]);
      }

      // Test that an unrecognized escape is passed through.
      nsString out2;
      nsTextFormatter::ssprintf(out2, u"%1m!", 23);
      EXPECT_STREQ("%1m!", NS_ConvertUTF16toUTF8(out2).get());

      // Treat NULL the same in both %s cases.
      nsTextFormatter::ssprintf(out2, u"%s %S", (char*)nullptr, (char16_t*)nullptr);
      EXPECT_STREQ("(null) (null)", NS_ConvertUTF16toUTF8(out2).get());

      nsTextFormatter::ssprintf(out2, u"%lld", INT64_MIN);
      EXPECT_STREQ("-9223372036854775808", NS_ConvertUTF16toUTF8(out2).get());

      // Regression test for bug 1401821.
      nsTextFormatter::ssprintf(out2, u"%*.f", 0, 23.2);
      EXPECT_STREQ("23", NS_ConvertUTF16toUTF8(out2).get());
    }

## Minimal test - lines (123, 139)

path: .spaces[3].metrics.halstead.time
old: 5.765719364395496
new: 310.2491292154649
path: .spaces[3].metrics.halstead.length
old: 15.0
new: 116.0
path: .spaces[3].metrics.halstead.N2
old: 7.0
new: 51.0
path: .spaces[3].metrics.halstead.effort
old: 103.78294855911892
new: 5584.4843258783685
path: .spaces[3].metrics.halstead.estimated_program_length
old: 27.651484454403228
new: 89.138352755659
path: .spaces[3].metrics.halstead.n2
old: 7.0
new: 17.0
path: .spaces[3].metrics.halstead.vocabulary
old: 11.0
new: 24.0
path: .spaces[3].metrics.halstead.bugs
old: 0.007361439526411013
new: 0.10492221801530864
path: .spaces[3].metrics.halstead.purity_ratio
old: 1.8434322969602153
new: 0.768434075479819
path: .spaces[3].metrics.halstead.N1
old: 8.0
new: 65.0
path: .spaces[3].metrics.halstead.level
old: 0.5
new: 0.09523809523809525
path: .spaces[3].metrics.halstead.difficulty
old: 2.0
new: 10.5
path: .spaces[3].metrics.halstead.n1
old: 4.0
new: 7.0
path: .spaces[3].metrics.halstead.volume
old: 51.89147427955946
new: 531.8556500836542
path: .spaces[3].metrics.mi.mi_sei
old: 123.14513831425162
new: 75.81546701388919
path: .spaces[3].metrics.mi.mi_original
old: 114.63935842319393
new: 92.23480881219751
path: .spaces[3].metrics.mi.mi_visual_studio
old: 67.04056048139995
new: 53.938484685495624
path: .spaces[3].metrics.nargs.average
old: null
new: 2.0
path: .spaces[3].metrics.nargs.sum
old: 0.0
new: 2.0
path: .spaces[3].metrics.cognitive.average
old: null
new: 0.0
path: .spaces[3].metrics.nom.functions
old: 0.0
new: 1.0
path: .spaces[3].metrics.nom.total
old: 0.0
new: 1.0
path: .spaces[3].metrics.loc.cloc
old: 2.0
new: 1.0
path: .spaces[3].metrics.loc.lloc
old: 0.0
new: 10.0
path: .spaces[3].metrics.loc.blank
old: 2.0
new: 0.0
path: .spaces[3].metrics.loc.ploc
old: 5.0
new: 16.0
path: .spaces[3].metrics.loc.sloc
old: 9.0
new: 17.0
path: .spaces[3].metrics.nexits.average
old: null
new: 0.0

### Code

    TEST(TextFormatterTestMismatch, format_u)
    {
      nsString out;
      nsTextFormatter::ssprintf(out, u"%u", int(-1));
      EXPECT_STREQ("4294967295", NS_ConvertUTF16toUTF8(out).get());
      // just for completeness, this is our format, and works
      nsTextFormatter::ssprintf(out, u"%u", uint32_t(-1));
      EXPECT_STREQ("4294967295", NS_ConvertUTF16toUTF8(out).get());
    #ifndef DEBUG
      nsTextFormatter::ssprintf(out, u"%u", float(3.5));
      EXPECT_STREQ("3.5", NS_ConvertUTF16toUTF8(out).get());
      nsTextFormatter::ssprintf(out, u"%u", "foo");
      EXPECT_STREQ("foo", NS_ConvertUTF16toUTF8(out).get());
      nsTextFormatter::ssprintf(out, u"%u", u"foo");
      EXPECT_STREQ("foo", NS_ConvertUTF16toUTF8(out).get());
    #endif
    }

## Minimal test - lines (53, 99)

path: .spaces[1].metrics.cognitive.average
old: null
new: 0.0
path: .spaces[1].metrics.nargs.sum
old: 0.0
new: 2.0
path: .spaces[1].metrics.nargs.average
old: null
new: 2.0
path: .spaces[1].metrics.nom.total
old: 0.0
new: 1.0
path: .spaces[1].metrics.nom.functions
old: 0.0
new: 1.0
path: .spaces[1].metrics.loc.blank
old: 0.0
new: 7.0
path: .spaces[1].metrics.loc.sloc
old: 1.0
new: 47.0
path: .spaces[1].metrics.loc.cloc
old: 0.0
new: 11.0
path: .spaces[1].metrics.loc.lloc
old: 0.0
new: 18.0
path: .spaces[1].metrics.loc.ploc
old: 1.0
new: 29.0
path: .spaces[1].metrics.halstead.n2
old: 1.0
new: 33.0
path: .spaces[1].metrics.halstead.N2
old: 1.0
new: 107.0
path: .spaces[1].metrics.halstead.effort
old: 0.0
new: 18804.236379916532
path: .spaces[1].metrics.halstead.bugs
old: 0.0
new: 0.2357124633401841
path: .spaces[1].metrics.halstead.N1
old: 0.0
new: 132.0
path: .spaces[1].metrics.halstead.estimated_program_length
old: null
new: 194.9943309518098
path: .spaces[1].metrics.halstead.purity_ratio
old: null
new: 0.8158758617230535
path: .spaces[1].metrics.halstead.difficulty
old: 0.0
new: 14.590909090909092
path: .spaces[1].metrics.halstead.level
old: null
new: 0.06853582554517133
path: .spaces[1].metrics.halstead.time
old: 0.0
new: 1044.6797988842518
path: .spaces[1].metrics.halstead.n1
old: 0.0
new: 9.0
path: .spaces[1].metrics.halstead.length
old: 1.0
new: 239.0
path: .spaces[1].metrics.halstead.volume
old: 0.0
new: 1288.7638640441237
path: .spaces[1].metrics.halstead.vocabulary
old: 1.0
new: 42.0
path: .spaces[1].metrics.nexits.average
old: null
new: 0.0
path: .spaces[1].metrics.mi.mi_sei
old: null
new: 61.122911456090506
path: .spaces[1].metrics.mi.mi_original
old: null
new: 71.15812712860084
path: .spaces[1].metrics.mi.mi_visual_studio
old: null
new: 41.61293984128704

### Code

    TEST(TextFormatterOrdering, orders)
    {
      nsString out;

      // plain list
      nsTextFormatter::ssprintf(out, u"%S %S %S", u"1", u"2", u"3");
      EXPECT_STREQ("1 2 3", NS_ConvertUTF16toUTF8(out).get());

      // ordered list
      nsTextFormatter::ssprintf(out, u"%2$S %3$S %1$S", u"1", u"2", u"3");
      EXPECT_STREQ("2 3 1", NS_ConvertUTF16toUTF8(out).get());

      // Mixed ordered list and non-ordered does not work.  This shouldn't
      // crash (hence the calls to ssprintf) but should fail for for
      // snprintf.
      nsTextFormatter::ssprintf(out, u"%2S %S %1$S", u"1", u"2", u"3");
      nsTextFormatter::ssprintf(out, u"%S %2$S", u"1", u"2");
      char16_t buffer[1024];  // plenty big
      EXPECT_EQ(nsTextFormatter::snprintf(buffer, sizeof(buffer), u"%2S %S %1$S",
                                          u"1", u"2", u"3"),
                uint32_t(-1));
      EXPECT_EQ(
          nsTextFormatter::snprintf(buffer, sizeof(buffer), u"%S %2$S", u"1", u"2"),
          uint32_t(-1));

      // Referencing an extra param returns empty strings in release.
    #ifndef DEBUG
      nsTextFormatter::ssprintf(out, u" %2$S ", u"1");
      EXPECT_STREQ("  ", NS_ConvertUTF16toUTF8(out).get());
    #endif

      // Double referencing existing argument works
      nsTextFormatter::ssprintf(out, u"%1$S %1$S", u"1");
      EXPECT_STREQ("1 1", NS_ConvertUTF16toUTF8(out).get());

      // Dropping trailing argument works
      nsTextFormatter::ssprintf(out, u" %1$S ", u"1", u"2");
      EXPECT_STREQ(" 1 ", NS_ConvertUTF16toUTF8(out).get());

      // Dropping leading arguments works
      nsTextFormatter::ssprintf(out, u" %2$S ", u"1", u"2");
      EXPECT_STREQ(" 2 ", NS_ConvertUTF16toUTF8(out).get());

      // Dropping middle arguments works
      nsTextFormatter::ssprintf(out, u" %3$S %1$S ", u"1", u"2", u"3");
      EXPECT_STREQ(" 3 1 ", NS_ConvertUTF16toUTF8(out).get());
    }