# Global Metrics

path: .metrics.nargs.average
old: 3.4
new: 2.0
path: .metrics.nargs.sum
old: 17.0
new: 50.0
path: .metrics.nexits.sum
old: 0.0
new: 15.0
path: .metrics.nexits.average
old: 0.0
new: 0.6
path: .metrics.nom.closures
old: 0.0
new: 2.0
path: .metrics.nom.functions
old: 5.0
new: 23.0
path: .metrics.nom.total
old: 5.0
new: 25.0
path: .metrics.cognitive.average
old: 0.8
new: 0.08
path: .metrics.cognitive.sum
old: 4.0
new: 2.0
path: .metrics.cyclomatic.average
old: 2.0
new: 1.1153846153846154
path: .metrics.cyclomatic.sum
old: 12.0
new: 29.0
path: .metrics.halstead.time
old: 3875.71179410116
new: 41295.406909827085
path: .metrics.halstead.vocabulary
old: 94.0
new: 154.0
path: .metrics.halstead.n2
old: 79.0
new: 128.0
path: .metrics.halstead.length
old: 505.0
new: 1540.0
path: .metrics.halstead.n1
old: 15.0
new: 26.0
path: .metrics.halstead.level
old: 0.04744744744744744
new: 0.015055281110326982
path: .metrics.halstead.purity_ratio
old: 1.10218225354479
new: 0.6611762549816028
path: .metrics.halstead.bugs
old: 0.5648867634620401
new: 2.735236701768442
path: .metrics.halstead.effort
old: 69762.81229382088
new: 743317.3243768875
path: .metrics.halstead.N1
old: 283.0
new: 886.0
path: .metrics.halstead.estimated_program_length
old: 556.6020380401189
new: 1018.2114326716684
path: .metrics.halstead.difficulty
old: 21.075949367088608
new: 66.421875
path: .metrics.halstead.volume
old: 3310.067370097207
new: 11190.851272670148
path: .metrics.halstead.N2
old: 222.0
new: 654.0
path: .metrics.loc.sloc
old: 95.0
new: 376.0
path: .metrics.loc.cloc
old: 16.0
new: 40.0
path: .metrics.loc.ploc
old: 71.0
new: 268.0
path: .metrics.loc.blank
old: 8.0
new: 68.0
path: .metrics.loc.lloc
old: 40.0
new: 108.0
path: .metrics.mi.mi_sei
old: 30.696670559658813
new: -19.991395190640645
path: .metrics.mi.mi_visual_studio
old: 30.59802952245576
new: 11.574167332395664
path: .metrics.mi.mi_original
old: 52.32263048339935
new: 19.791826138396587

# Spaces Data

## Minimal test - lines (67, 75)

path: .spaces[2].metrics.halstead.N2
old: 33.0
new: 27.0
path: .spaces[2].metrics.halstead.bugs
old: 0.09197083824485829
new: 0.08469324259929253
path: .spaces[2].metrics.halstead.time
old: 254.6153568622745
new: 225.0
path: .spaces[2].metrics.halstead.estimated_program_length
old: 112.50641830990963
new: 128.09022723538357
path: .spaces[2].metrics.halstead.N1
old: 48.0
new: 41.0
path: .spaces[2].metrics.halstead.difficulty
old: 11.647058823529411
new: 11.911764705882351
path: .spaces[2].metrics.halstead.level
old: 0.08585858585858586
new: 0.08395061728395062
path: .spaces[2].metrics.halstead.volume
old: 393.4964606053333
new: 340.0
path: .spaces[2].metrics.halstead.effort
old: 4583.076423520941
new: 4050.0
path: .spaces[2].metrics.halstead.purity_ratio
old: 1.388968127282835
new: 1.8836798122850524
path: .spaces[2].metrics.halstead.vocabulary
old: 29.0
new: 32.0
path: .spaces[2].metrics.halstead.length
old: 81.0
new: 68.0
path: .spaces[2].metrics.halstead.n1
old: 12.0
new: 15.0
path: .spaces[2].metrics.mi.mi_original
old: 97.9174456286532
new: 104.63444463558017
path: .spaces[2].metrics.mi.mi_visual_studio
old: 57.26166411032351
new: 61.18973370501763
path: .spaces[2].metrics.mi.mi_sei
old: 94.31452442510714
new: 75.4583821087185
path: .spaces[2].metrics.nargs.average
old: 2.0
new: 6.0
path: .spaces[2].metrics.nargs.sum
old: 2.0
new: 6.0
path: .spaces[2].metrics.nexits.average
old: 0.0
new: 2.0
path: .spaces[2].metrics.nexits.sum
old: 0.0
new: 2.0
path: .spaces[2].metrics.loc.cloc
old: 2.0
new: 0.0
path: .spaces[2].metrics.loc.sloc
old: 13.0
new: 9.0
path: .spaces[2].metrics.loc.lloc
old: 4.0
new: 5.0
path: .spaces[2].metrics.loc.ploc
old: 12.0
new: 9.0

### Code

    static nsresult ReadSegmentsFunction(nsIInputStream* aInStr, void* aClosure,
                                         const char* aBuffer, uint32_t aOffset,
                                         uint32_t aCount, uint32_t* aCountWritten) {
      ReadSegmentsData* data = static_cast(aClosure);
      if (aInStr != data->mStream) return NS_ERROR_FAILURE;
      memcpy(&data->mBuffer[aOffset], aBuffer, aCount);
      *aCountWritten = aCount;
      return NS_OK;
    }

## Minimal test - lines (77, 101)

path: .spaces[3].metrics.halstead.length
old: 72.0
new: 114.0
path: .spaces[3].metrics.halstead.N2
old: 32.0
new: 53.0
path: .spaces[3].metrics.halstead.estimated_program_length
old: 82.60335893412778
new: 187.90890672641936
path: .spaces[3].metrics.halstead.purity_ratio
old: 1.147268874085108
new: 1.6483237432142048
path: .spaces[3].metrics.halstead.difficulty
old: 8.533333333333333
new: 13.25
path: .spaces[3].metrics.halstead.n1
old: 8.0
new: 14.0
path: .spaces[3].metrics.halstead.volume
old: 325.69646083610496
new: 614.7241861967788
path: .spaces[3].metrics.halstead.level
old: 0.1171875
new: 0.07547169811320754
path: .spaces[3].metrics.halstead.bugs
old: 0.06589208427946382
new: 0.13494067075355975
path: .spaces[3].metrics.halstead.time
old: 154.40424810007937
new: 452.50530372818434
path: .spaces[3].metrics.halstead.vocabulary
old: 23.0
new: 42.0
path: .spaces[3].metrics.halstead.n2
old: 15.0
new: 28.0
path: .spaces[3].metrics.halstead.N1
old: 40.0
new: 61.0
path: .spaces[3].metrics.halstead.effort
old: 2779.276465801429
new: 8145.095467107319
path: .spaces[3].metrics.nargs.sum
old: 4.0
new: 2.0
path: .spaces[3].metrics.nargs.average
old: 4.0
new: 2.0
path: .spaces[3].metrics.mi.mi_visual_studio
old: 58.729526242569264
new: 49.84450786656807
path: .spaces[3].metrics.mi.mi_original
old: 100.42748987479344
new: 85.2341084518314
path: .spaces[3].metrics.mi.mi_sei
old: 98.84356533944744
new: 72.93105419166835
path: .spaces[3].metrics.loc.lloc
old: 7.0
new: 6.0
path: .spaces[3].metrics.loc.sloc
old: 12.0
new: 25.0
path: .spaces[3].metrics.loc.cloc
old: 2.0
new: 3.0
path: .spaces[3].metrics.loc.ploc
old: 10.0
new: 19.0
path: .spaces[3].metrics.loc.blank
old: 0.0
new: 3.0

### Code

    TEST(TestNonBlockingAsyncInputStream, ReadSegments)
    {
      nsCString data;
      data.Assign("Hello world!");

      nsCOMPtr async;
      {
        // Let's create a test string inputStream
        nsCOMPtr stream;
        ASSERT_EQ(NS_OK, NS_NewCStringInputStream(getter_AddRefs(stream), data));

        // Here the non-blocking stream.
        ASSERT_EQ(NS_OK, NonBlockingAsyncInputStream::Create(
                             stream.forget(), getter_AddRefs(async)));
      }

      // Read works fine.
      char buffer[1024];
      uint32_t read = 0;
      ReadSegmentsData closure(async, buffer);
      ASSERT_EQ(NS_OK, async->ReadSegments(ReadSegmentsFunction, &closure,
                                           sizeof(buffer), &read));
      ASSERT_EQ(data.Length(), read);
      ASSERT_TRUE(data.Equals(nsCString(buffer, read)));
    }

## Minimal test - lines (58, 65)

path: .spaces[1].metrics.nargs.average
old: 7.0
new: 2.0
path: .spaces[1].metrics.nargs.sum
old: 7.0
new: 2.0
path: .spaces[1].metrics.cognitive.average
old: 2.0
new: 0.0
path: .spaces[1].metrics.cognitive.sum
old: 2.0
new: 0.0
path: .spaces[1].metrics.mi.mi_original
old: 80.42372991864767
new: 112.53916010114216
path: .spaces[1].metrics.mi.mi_visual_studio
old: 47.03142100505712
new: 65.81237432815331
path: .spaces[1].metrics.mi.mi_sei
old: 65.52270586879243
new: 86.86247591052307
path: .spaces[1].metrics.loc.lloc
old: 14.0
new: 0.0
path: .spaces[1].metrics.loc.sloc
old: 27.0
new: 8.0
path: .spaces[1].metrics.loc.cloc
old: 3.0
new: 0.0
path: .spaces[1].metrics.loc.ploc
old: 24.0
new: 7.0
path: .spaces[1].metrics.loc.blank
old: 0.0
new: 1.0
path: .spaces[1].metrics.cyclomatic.sum
old: 5.0
new: 2.0
path: .spaces[1].metrics.cyclomatic.average
old: 5.0
new: 1.0
path: .spaces[1].metrics.halstead.n2
old: 34.0
new: 6.0
path: .spaces[1].metrics.halstead.N1
old: 103.0
new: 17.0
path: .spaces[1].metrics.halstead.purity_ratio
old: 1.2015187659692703
new: 1.2124572227148334
path: .spaces[1].metrics.halstead.bugs
old: 0.21012200927356575
new: 0.027545140571351757
path: .spaces[1].metrics.halstead.length
old: 184.0
new: 29.0
path: .spaces[1].metrics.halstead.estimated_program_length
old: 221.07945293834572
new: 35.161259458730164
path: .spaces[1].metrics.halstead.vocabulary
old: 47.0
new: 13.0
path: .spaces[1].metrics.halstead.level
old: 0.06457739791073125
new: 0.14285714285714285
path: .spaces[1].metrics.halstead.difficulty
old: 15.485294117647058
new: 7.0
path: .spaces[1].metrics.halstead.volume
old: 1022.0443487086852
new: 107.31275182609168
path: .spaces[1].metrics.halstead.effort
old: 15826.657341033024
new: 751.1892627826417
path: .spaces[1].metrics.halstead.time
old: 879.2587411685013
new: 41.73273682125787
path: .spaces[1].metrics.halstead.N2
old: 81.0
new: 12.0
path: .spaces[1].metrics.halstead.n1
old: 13.0
new: 7.0

### Code

    class ReadSegmentsData {
     public:
      ReadSegmentsData(nsIInputStream* aStream, char* aBuffer)
          : mStream(aStream), mBuffer(aBuffer) {}

      nsIInputStream* mStream;
      char* mBuffer;
    };

## Minimal test - lines (103, 146)

path: .spaces[4].metrics.mi.mi_visual_studio
old: 66.27126771560744
new: 42.128952067060595
path: .spaces[4].metrics.mi.mi_sei
old: 87.89274994770298
new: 55.40245041443339
path: .spaces[4].metrics.mi.mi_original
old: 113.32386779368872
new: 72.04050803467362
path: .spaces[4].metrics.nargs.sum
old: 1.0
new: 2.0
path: .spaces[4].metrics.nom.total
old: 1.0
new: 2.0
path: .spaces[4].metrics.nom.closures
old: 0.0
new: 1.0
path: .spaces[4].metrics.loc.sloc
old: 6.0
new: 44.0
path: .spaces[4].metrics.loc.blank
old: 0.0
new: 8.0
path: .spaces[4].metrics.loc.ploc
old: 6.0
new: 30.0
path: .spaces[4].metrics.loc.cloc
old: 0.0
new: 6.0
path: .spaces[4].metrics.loc.lloc
old: 4.0
new: 17.0
path: .spaces[4].metrics.nexits.sum
old: 0.0
new: 1.0
path: .spaces[4].metrics.nexits.average
old: 0.0
new: 0.5
path: .spaces[4].metrics.halstead.volume
old: 236.34987578777677
new: 1335.7318132437258
path: .spaces[4].metrics.halstead.bugs
old: 0.05080584308313289
new: 0.3080971477192638
path: .spaces[4].metrics.halstead.level
old: 0.12560386473429952
new: 0.047534165181224
path: .spaces[4].metrics.halstead.estimated_program_length
old: 76.63504134881501
new: 282.3639920967503
path: .spaces[4].metrics.halstead.N2
old: 23.0
new: 99.0
path: .spaces[4].metrics.halstead.N1
old: 30.0
new: 130.0
path: .spaces[4].metrics.halstead.n1
old: 9.0
new: 17.0
path: .spaces[4].metrics.halstead.length
old: 53.0
new: 229.0
path: .spaces[4].metrics.halstead.time
old: 104.53936813690126
new: 1561.1365567286043
path: .spaces[4].metrics.halstead.n2
old: 13.0
new: 40.0
path: .spaces[4].metrics.halstead.purity_ratio
old: 1.445944176392736
new: 1.233030533173582
path: .spaces[4].metrics.halstead.vocabulary
old: 22.0
new: 57.0
path: .spaces[4].metrics.halstead.difficulty
old: 7.961538461538462
new: 21.0375
path: .spaces[4].metrics.halstead.effort
old: 1881.7086264642228
new: 28100.45802111488

### Code

    TEST(TestNonBlockingAsyncInputStream, AsyncWait_Simple)
    {
      nsCString data;
      data.Assign("Hello world!");

      nsCOMPtr async;
      {
        // Let's create a test string inputStream
        nsCOMPtr stream;
        ASSERT_EQ(NS_OK, NS_NewCStringInputStream(getter_AddRefs(stream), data));

        // Here the non-blocking stream.
        ASSERT_EQ(NS_OK, NonBlockingAsyncInputStream::Create(
                             stream.forget(), getter_AddRefs(async)));
      }
      ASSERT_TRUE(!!async);

      // Testing ::Available()
      uint64_t length;
      ASSERT_EQ(NS_OK, async->Available(&length));
      ASSERT_EQ(data.Length(), length);

      // Testing ::AsyncWait - without EventTarget
      RefPtr cb = new testing::InputStreamCallback();

      ASSERT_EQ(NS_OK, async->AsyncWait(cb, 0, 0, nullptr));
      ASSERT_TRUE(cb->Called());

      // Testing ::AsyncWait - with EventTarget
      cb = new testing::InputStreamCallback();
      nsCOMPtr thread = do_GetCurrentThread();

      ASSERT_EQ(NS_OK, async->AsyncWait(cb, 0, 0, thread));
      ASSERT_FALSE(cb->Called());
      MOZ_ALWAYS_TRUE(SpinEventLoopUntil([&]() { return cb->Called(); }));
      ASSERT_TRUE(cb->Called());

      // Read works fine.
      char buffer[1024];
      uint32_t read = 0;
      ASSERT_EQ(NS_OK, async->Read(buffer, sizeof(buffer), &read));
      ASSERT_EQ(data.Length(), read);
      ASSERT_TRUE(data.Equals(nsCString(buffer, read)));
    }

## Minimal test - lines (14, 56)

path: .spaces[0].metrics.nargs.sum
old: 3.0
new: 2.0
path: .spaces[0].metrics.nargs.average
old: 3.0
new: 2.0
path: .spaces[0].metrics.cognitive.average
old: 1.0
new: 0.0
path: .spaces[0].metrics.cognitive.sum
old: 1.0
new: 0.0
path: .spaces[0].metrics.halstead.n2
old: 19.0
new: 33.0
path: .spaces[0].metrics.halstead.length
old: 112.0
new: 180.0
path: .spaces[0].metrics.halstead.time
old: 441.9071062711766
new: 1040.8339205889429
path: .spaces[0].metrics.halstead.bugs
old: 0.13282538161303867
new: 0.2351336074584321
path: .spaces[0].metrics.halstead.level
old: 0.06909090909090909
new: 0.05365853658536585
path: .spaces[0].metrics.halstead.N2
old: 50.0
new: 82.0
path: .spaces[0].metrics.halstead.effort
old: 7954.327912881178
new: 18735.01057060097
path: .spaces[0].metrics.halstead.n1
old: 11.0
new: 15.0
path: .spaces[0].metrics.halstead.N1
old: 62.0
new: 98.0
path: .spaces[0].metrics.halstead.vocabulary
old: 30.0
new: 48.0
path: .spaces[0].metrics.halstead.volume
old: 549.5717467081541
new: 1005.293250129808
path: .spaces[0].metrics.halstead.purity_ratio
old: 1.0603961657181995
new: 1.2503798048497596
path: .spaces[0].metrics.halstead.difficulty
old: 14.473684210526317
new: 18.636363636363637
path: .spaces[0].metrics.halstead.estimated_program_length
old: 118.76437056043838
new: 225.06836487295675
path: .spaces[0].metrics.loc.sloc
old: 21.0
new: 43.0
path: .spaces[0].metrics.loc.cloc
old: 3.0
new: 7.0
path: .spaces[0].metrics.loc.blank
old: 2.0
new: 8.0
path: .spaces[0].metrics.loc.ploc
old: 16.0
new: 28.0
path: .spaces[0].metrics.loc.lloc
old: 11.0
new: 15.0
path: .spaces[0].metrics.mi.mi_visual_studio
old: 51.70246314589086
new: 43.2109815008314
path: .spaces[0].metrics.mi.mi_sei
old: 79.68568194865762
new: 60.26004832292654
path: .spaces[0].metrics.mi.mi_original
old: 88.41121197947336
new: 73.8907783664217
path: .spaces[0].metrics.cyclomatic.sum
old: 2.0
new: 1.0
path: .spaces[0].metrics.cyclomatic.average
old: 2.0
new: 1.0

### Code

    TEST(TestNonBlockingAsyncInputStream, Simple)
    {
      nsCString data;
      data.Assign("Hello world!");

      // It should not be async.
      bool nonBlocking = false;
      nsCOMPtr async;

      {
        // Let's create a test string inputStream
        nsCOMPtr stream;
        ASSERT_EQ(NS_OK, NS_NewCStringInputStream(getter_AddRefs(stream), data));

        async = do_QueryInterface(stream);
        ASSERT_EQ(nullptr, async);

        // It must be non-blocking
        ASSERT_EQ(NS_OK, stream->IsNonBlocking(&nonBlocking));
        ASSERT_TRUE(nonBlocking);

        // Here the non-blocking stream.
        ASSERT_EQ(NS_OK, NonBlockingAsyncInputStream::Create(
                             stream.forget(), getter_AddRefs(async)));
      }
      ASSERT_TRUE(!!async);

      // Still non-blocking
      ASSERT_EQ(NS_OK, async->IsNonBlocking(&nonBlocking));
      ASSERT_TRUE(nonBlocking);

      // Testing ::Available()
      uint64_t length;
      ASSERT_EQ(NS_OK, async->Available(&length));
      ASSERT_EQ(data.Length(), length);

      // Read works fine.
      char buffer[1024];
      uint32_t read = 0;
      ASSERT_EQ(NS_OK, async->Read(buffer, sizeof(buffer), &read));
      ASSERT_EQ(data.Length(), read);
      ASSERT_TRUE(data.Equals(nsCString(buffer, read)));
    }