Global Metrics
path: .metrics.nom.functions
old: 4.0
new: 10.0
path: .metrics.nom.total
old: 4.0
new: 10.0
path: .metrics.cognitive.sum
old: 9.0
new: 23.0
path: .metrics.cognitive.average
old: 2.25
new: 2.3
path: .metrics.cyclomatic.sum
old: 24.0
new: 34.0
path: .metrics.cyclomatic.average
old: 3.4285714285714284
new: 2.6153846153846154
path: .metrics.loc.ploc
old: 174.0
new: 186.0
path: .metrics.loc.cloc
old: 14.0
new: 28.0
path: .metrics.loc.sloc
old: 199.0
new: 260.0
path: .metrics.loc.blank
old: 11.0
new: 46.0
path: .metrics.loc.lloc
old: 64.0
new: 80.0
path: .metrics.nexits.sum
old: 8.0
new: 17.0
path: .metrics.nexits.average
old: 2.0
new: 1.7
path: .metrics.mi.mi_original
old: 33.997691289902946
new: 27.793000723440173
path: .metrics.mi.mi_sei
old: -4.236844165870128
new: -7.803528407939176
path: .metrics.mi.mi_visual_studio
old: 19.881690812808746
new: 16.253216797333433
path: .metrics.halstead.n1
old: 28.0
new: 23.0
path: .metrics.halstead.effort
old: 254686.39060577992
new: 191298.73266158724
path: .metrics.halstead.difficulty
old: 38.60606060606061
new: 31.478102189781023
path: .metrics.halstead.length
old: 901.0
new: 830.0
path: .metrics.halstead.purity_ratio
old: 1.1814272603473128
new: 1.296954602837233
path: .metrics.halstead.N2
old: 364.0
new: 375.0
path: .metrics.halstead.level
old: 0.025902668759811617
new: 0.03176811594202898
path: .metrics.halstead.n2
old: 132.0
new: 137.0
path: .metrics.halstead.time
old: 14149.243922543328
new: 10627.70737008818
path: .metrics.halstead.estimated_program_length
old: 1064.4659615729288
new: 1076.472320354903
path: .metrics.halstead.volume
old: 6597.057213493514
new: 6077.200318756511
path: .metrics.halstead.N1
old: 537.0
new: 455.0
path: .metrics.halstead.bugs
old: 1.339314501047791
new: 1.1066751051550203
path: .metrics.nargs.average
old: 2.0
new: 0.9
path: .metrics.nargs.sum
old: 8.0
new: 9.0
Spaces Data
Minimal test - lines (35, 258)
path: .spaces[0].metrics.nargs.sum
old: 8.0
new: 9.0
path: .spaces[0].metrics.nargs.average
old: 2.0
new: 0.9
path: .spaces[0].metrics.cyclomatic.sum
old: 23.0
new: 33.0
path: .spaces[0].metrics.cyclomatic.average
old: 3.8333333333333335
new: 2.75
path: .spaces[0].metrics.loc.sloc
old: 178.0
new: 224.0
path: .spaces[0].metrics.loc.lloc
old: 64.0
new: 80.0
path: .spaces[0].metrics.loc.blank
old: 9.0
new: 42.0
path: .spaces[0].metrics.loc.cloc
old: 8.0
new: 17.0
path: .spaces[0].metrics.loc.ploc
old: 161.0
new: 165.0
path: .spaces[0].metrics.nexits.average
old: 2.0
new: 1.7
path: .spaces[0].metrics.nexits.sum
old: 8.0
new: 17.0
path: .spaces[0].metrics.halstead.N2
old: 352.0
new: 358.0
path: .spaces[0].metrics.halstead.vocabulary
old: 148.0
new: 144.0
path: .spaces[0].metrics.halstead.length
old: 889.0
new: 813.0
path: .spaces[0].metrics.halstead.level
old: 0.02435064935064935
new: 0.02939033276657761
path: .spaces[0].metrics.halstead.bugs
old: 1.369013652915989
new: 1.1336504951911
path: .spaces[0].metrics.halstead.volume
old: 6409.204042044136
new: 5829.149026172599
path: .spaces[0].metrics.halstead.estimated_program_length
old: 963.4328092906352
new: 941.2243766995372
path: .spaces[0].metrics.halstead.N1
old: 537.0
new: 455.0
path: .spaces[0].metrics.halstead.difficulty
old: 41.06666666666667
new: 34.02479338842975
path: .spaces[0].metrics.halstead.n1
old: 28.0
new: 23.0
path: .spaces[0].metrics.halstead.n2
old: 120.0
new: 121.0
path: .spaces[0].metrics.halstead.effort
old: 263204.64599327923
new: 198335.59124588917
path: .spaces[0].metrics.halstead.purity_ratio
old: 1.083726444646384
new: 1.157717560516036
path: .spaces[0].metrics.halstead.time
old: 14622.480332959958
new: 11018.643958104954
path: .spaces[0].metrics.cognitive.sum
old: 9.0
new: 23.0
path: .spaces[0].metrics.cognitive.average
old: 2.25
new: 2.3
path: .spaces[0].metrics.mi.mi_visual_studio
old: 21.160559399255693
new: 17.926360923312096
path: .spaces[0].metrics.mi.mi_sei
old: -5.0279267377559975
new: -7.419132620879299
path: .spaces[0].metrics.mi.mi_original
old: 36.18455657272723
new: 30.654077178863687
path: .spaces[0].metrics.nom.functions
old: 4.0
new: 10.0
path: .spaces[0].metrics.nom.total
old: 4.0
new: 10.0
Code
namespace {
static uint32_t gFailCount = 0;
/**
* Prints the given failure message and arguments using printf, prepending
* "TEST-UNEXPECTED-FAIL " for the benefit of the test harness and
* appending "\n" to eliminate having to type it at each call site.
*/
MOZ_FORMAT_PRINTF(1, 2) void fail(const char* msg, ...) {
va_list ap;
printf("TEST-UNEXPECTED-FAIL | ");
va_start(ap, msg);
vprintf(msg, ap);
va_end(ap);
putchar('\n');
++gFailCount;
}
//-----------------------------------------------------------------------------
class ScopedXPCOM final : public nsIDirectoryServiceProvider2 {
public:
NS_DECL_ISUPPORTS
explicit ScopedXPCOM(const char* testName,
nsIDirectoryServiceProvider* dirSvcProvider = nullptr)
: mDirSvcProvider(dirSvcProvider) {
mTestName = testName;
printf("Running %s tests...\n", mTestName);
nsresult rv = NS_InitXPCOM(&mServMgr, nullptr, this);
if (NS_FAILED(rv)) {
fail("NS_InitXPCOM returned failure code 0x%" PRIx32,
static_cast(rv));
mServMgr = nullptr;
return;
}
}
~ScopedXPCOM() {
// If we created a profile directory, we need to remove it.
if (mProfD) {
nsCOMPtr os =
do_GetService(NS_OBSERVERSERVICE_CONTRACTID);
MOZ_ASSERT(os);
if (os) {
MOZ_ALWAYS_SUCCEEDS(os->NotifyObservers(
nullptr, "profile-change-net-teardown", nullptr));
MOZ_ALWAYS_SUCCEEDS(
os->NotifyObservers(nullptr, "profile-change-teardown", nullptr));
MOZ_ALWAYS_SUCCEEDS(
os->NotifyObservers(nullptr, "profile-before-change", nullptr));
MOZ_ALWAYS_SUCCEEDS(
os->NotifyObservers(nullptr, "profile-before-change-qm", nullptr));
MOZ_ALWAYS_SUCCEEDS(os->NotifyObservers(
nullptr, "profile-before-change-telemetry", nullptr));
}
if (NS_FAILED(mProfD->Remove(true))) {
NS_WARNING("Problem removing profile directory");
}
mProfD = nullptr;
}
if (mServMgr) {
NS_RELEASE(mServMgr);
nsresult rv = NS_ShutdownXPCOM(nullptr);
if (NS_FAILED(rv)) {
fail("XPCOM shutdown failed with code 0x%" PRIx32,
static_cast(rv));
exit(1);
}
}
printf("Finished running %s tests.\n", mTestName);
}
already_AddRefed GetProfileDirectory() {
if (mProfD) {
nsCOMPtr copy = mProfD;
return copy.forget();
}
// Create a unique temporary folder to use for this test.
// Note that runcppunittests.py will run tests with a temp
// directory as the cwd, so just put something under that.
nsCOMPtr profD;
nsresult rv = NS_GetSpecialDirectory(NS_OS_CURRENT_PROCESS_DIR,
getter_AddRefs(profD));
NS_ENSURE_SUCCESS(rv, nullptr);
rv = profD->Append(u"cpp-unit-profd"_ns);
NS_ENSURE_SUCCESS(rv, nullptr);
rv = profD->CreateUnique(nsIFile::DIRECTORY_TYPE, 0755);
NS_ENSURE_SUCCESS(rv, nullptr);
mProfD = profD;
return profD.forget();
}
already_AddRefed GetGREDirectory() {
if (mGRED) {
nsCOMPtr copy = mGRED;
return copy.forget();
}
char* env = PR_GetEnv("MOZ_XRE_DIR");
nsCOMPtr greD;
if (env) {
NS_NewLocalFile(NS_ConvertUTF8toUTF16(env), false, getter_AddRefs(greD));
}
mGRED = greD;
return greD.forget();
}
already_AddRefed GetGREBinDirectory() {
if (mGREBinD) {
nsCOMPtr copy = mGREBinD;
return copy.forget();
}
nsCOMPtr greD = GetGREDirectory();
if (!greD) {
return greD.forget();
}
greD->Clone(getter_AddRefs(mGREBinD));
#ifdef XP_MACOSX
nsAutoCString leafName;
mGREBinD->GetNativeLeafName(leafName);
if (leafName.EqualsLiteral("Resources")) {
mGREBinD->SetNativeLeafName("MacOS"_ns);
}
#endif
nsCOMPtr copy = mGREBinD;
return copy.forget();
}
////////////////////////////////////////////////////////////////////////////
//// nsIDirectoryServiceProvider
NS_IMETHODIMP GetFile(const char* aProperty, bool* _persistent,
nsIFile** _result) override {
// If we were supplied a directory service provider, ask it first.
if (mDirSvcProvider && NS_SUCCEEDED(mDirSvcProvider->GetFile(
aProperty, _persistent, _result))) {
return NS_OK;
}
// Otherwise, the test harness provides some directories automatically.
if (0 == strcmp(aProperty, NS_APP_USER_PROFILE_50_DIR) ||
0 == strcmp(aProperty, NS_APP_USER_PROFILE_LOCAL_50_DIR) ||
0 == strcmp(aProperty, NS_APP_PROFILE_LOCAL_DIR_STARTUP)) {
nsCOMPtr profD = GetProfileDirectory();
NS_ENSURE_TRUE(profD, NS_ERROR_FAILURE);
nsCOMPtr clone;
nsresult rv = profD->Clone(getter_AddRefs(clone));
NS_ENSURE_SUCCESS(rv, rv);
*_persistent = true;
clone.forget(_result);
return NS_OK;
} else if (0 == strcmp(aProperty, NS_GRE_DIR)) {
nsCOMPtr greD = GetGREDirectory();
NS_ENSURE_TRUE(greD, NS_ERROR_FAILURE);
*_persistent = true;
greD.forget(_result);
return NS_OK;
} else if (0 == strcmp(aProperty, NS_GRE_BIN_DIR)) {
nsCOMPtr greBinD = GetGREBinDirectory();
NS_ENSURE_TRUE(greBinD, NS_ERROR_FAILURE);
*_persistent = true;
greBinD.forget(_result);
return NS_OK;
}
return NS_ERROR_FAILURE;
}
////////////////////////////////////////////////////////////////////////////
//// nsIDirectoryServiceProvider2
NS_IMETHODIMP GetFiles(const char* aProperty,
nsISimpleEnumerator** _enum) override {
// If we were supplied a directory service provider, ask it first.
nsCOMPtr provider =
do_QueryInterface(mDirSvcProvider);
if (provider && NS_SUCCEEDED(provider->GetFiles(aProperty, _enum))) {
return NS_OK;
}
return NS_ERROR_FAILURE;
}
private:
const char* mTestName;
nsIServiceManager* mServMgr;
nsCOMPtr mDirSvcProvider;
nsCOMPtr mProfD;
nsCOMPtr mGRED;
nsCOMPtr mGREBinD;
};
NS_IMPL_QUERY_INTERFACE(ScopedXPCOM, nsIDirectoryServiceProvider,
nsIDirectoryServiceProvider2)
NS_IMETHODIMP_(MozExternalRefCountType)
ScopedXPCOM::AddRef() { return 2; }
NS_IMETHODIMP_(MozExternalRefCountType)
ScopedXPCOM::Release() { return 1; }
} // namespace
Minimal test - lines (59, 247)
path: .spaces[0].spaces[1].metrics.cyclomatic.average
old: 1.0
new: 3.625
path: .spaces[0].spaces[1].metrics.cyclomatic.sum
old: 1.0
new: 29.0
path: .spaces[0].spaces[1].metrics.nom.functions
old: 1.0
new: 7.0
path: .spaces[0].spaces[1].metrics.nom.total
old: 1.0
new: 7.0
path: .spaces[0].spaces[1].metrics.loc.sloc
old: 4.0
new: 189.0
path: .spaces[0].spaces[1].metrics.loc.blank
old: 0.0
new: 31.0
path: .spaces[0].spaces[1].metrics.loc.lloc
old: 1.0
new: 69.0
path: .spaces[0].spaces[1].metrics.loc.cloc
old: 0.0
new: 11.0
path: .spaces[0].spaces[1].metrics.loc.ploc
old: 4.0
new: 147.0
path: .spaces[0].spaces[1].metrics.nargs.sum
old: 2.0
new: 7.0
path: .spaces[0].spaces[1].metrics.nargs.average
old: 2.0
new: 1.0
path: .spaces[0].spaces[1].metrics.nexits.average
old: 0.0
new: 2.142857142857143
path: .spaces[0].spaces[1].metrics.nexits.sum
old: 0.0
new: 15.0
path: .spaces[0].spaces[1].metrics.halstead.volume
old: 140.0
new: 5129.694560090769
path: .spaces[0].spaces[1].metrics.halstead.N1
old: 22.0
new: 409.0
path: .spaces[0].spaces[1].metrics.halstead.n1
old: 7.0
new: 22.0
path: .spaces[0].spaces[1].metrics.halstead.length
old: 35.0
new: 734.0
path: .spaces[0].spaces[1].metrics.halstead.n2
old: 9.0
new: 105.0
path: .spaces[0].spaces[1].metrics.halstead.estimated_program_length
old: 48.18080946738404
new: 803.1032749649635
path: .spaces[0].spaces[1].metrics.halstead.level
old: 0.19780219780219785
new: 0.029370629370629366
path: .spaces[0].spaces[1].metrics.halstead.purity_ratio
old: 1.3765945562109725
new: 1.0941461511784245
path: .spaces[0].spaces[1].metrics.halstead.N2
old: 13.0
new: 325.0
path: .spaces[0].spaces[1].metrics.halstead.effort
old: 707.7777777777777
new: 174653.8862126143
path: .spaces[0].spaces[1].metrics.halstead.time
old: 39.32098765432099
new: 9702.993678478571
path: .spaces[0].spaces[1].metrics.halstead.bugs
old: 0.02647341862482068
new: 1.041511926885946
path: .spaces[0].spaces[1].metrics.halstead.difficulty
old: 5.055555555555555
new: 34.04761904761905
path: .spaces[0].spaces[1].metrics.halstead.vocabulary
old: 16.0
new: 127.0
path: .spaces[0].spaces[1].metrics.cognitive.sum
old: 0.0
new: 23.0
path: .spaces[0].spaces[1].metrics.cognitive.average
old: 0.0
new: 3.2857142857142856
path: .spaces[0].spaces[1].metrics.mi.mi_sei
old: 101.29772831188616
new: -4.0114955221940285
path: .spaces[0].spaces[1].metrics.mi.mi_original
old: 122.61549075228942
new: 34.991131094499394
path: .spaces[0].spaces[1].metrics.mi.mi_visual_studio
old: 71.70496535221604
new: 20.462649762865144
Code
class ScopedXPCOM final : public nsIDirectoryServiceProvider2 {
public:
NS_DECL_ISUPPORTS
explicit ScopedXPCOM(const char* testName,
nsIDirectoryServiceProvider* dirSvcProvider = nullptr)
: mDirSvcProvider(dirSvcProvider) {
mTestName = testName;
printf("Running %s tests...\n", mTestName);
nsresult rv = NS_InitXPCOM(&mServMgr, nullptr, this);
if (NS_FAILED(rv)) {
fail("NS_InitXPCOM returned failure code 0x%" PRIx32,
static_cast(rv));
mServMgr = nullptr;
return;
}
}
~ScopedXPCOM() {
// If we created a profile directory, we need to remove it.
if (mProfD) {
nsCOMPtr os =
do_GetService(NS_OBSERVERSERVICE_CONTRACTID);
MOZ_ASSERT(os);
if (os) {
MOZ_ALWAYS_SUCCEEDS(os->NotifyObservers(
nullptr, "profile-change-net-teardown", nullptr));
MOZ_ALWAYS_SUCCEEDS(
os->NotifyObservers(nullptr, "profile-change-teardown", nullptr));
MOZ_ALWAYS_SUCCEEDS(
os->NotifyObservers(nullptr, "profile-before-change", nullptr));
MOZ_ALWAYS_SUCCEEDS(
os->NotifyObservers(nullptr, "profile-before-change-qm", nullptr));
MOZ_ALWAYS_SUCCEEDS(os->NotifyObservers(
nullptr, "profile-before-change-telemetry", nullptr));
}
if (NS_FAILED(mProfD->Remove(true))) {
NS_WARNING("Problem removing profile directory");
}
mProfD = nullptr;
}
if (mServMgr) {
NS_RELEASE(mServMgr);
nsresult rv = NS_ShutdownXPCOM(nullptr);
if (NS_FAILED(rv)) {
fail("XPCOM shutdown failed with code 0x%" PRIx32,
static_cast(rv));
exit(1);
}
}
printf("Finished running %s tests.\n", mTestName);
}
already_AddRefed GetProfileDirectory() {
if (mProfD) {
nsCOMPtr copy = mProfD;
return copy.forget();
}
// Create a unique temporary folder to use for this test.
// Note that runcppunittests.py will run tests with a temp
// directory as the cwd, so just put something under that.
nsCOMPtr profD;
nsresult rv = NS_GetSpecialDirectory(NS_OS_CURRENT_PROCESS_DIR,
getter_AddRefs(profD));
NS_ENSURE_SUCCESS(rv, nullptr);
rv = profD->Append(u"cpp-unit-profd"_ns);
NS_ENSURE_SUCCESS(rv, nullptr);
rv = profD->CreateUnique(nsIFile::DIRECTORY_TYPE, 0755);
NS_ENSURE_SUCCESS(rv, nullptr);
mProfD = profD;
return profD.forget();
}
already_AddRefed GetGREDirectory() {
if (mGRED) {
nsCOMPtr copy = mGRED;
return copy.forget();
}
char* env = PR_GetEnv("MOZ_XRE_DIR");
nsCOMPtr greD;
if (env) {
NS_NewLocalFile(NS_ConvertUTF8toUTF16(env), false, getter_AddRefs(greD));
}
mGRED = greD;
return greD.forget();
}
already_AddRefed GetGREBinDirectory() {
if (mGREBinD) {
nsCOMPtr copy = mGREBinD;
return copy.forget();
}
nsCOMPtr greD = GetGREDirectory();
if (!greD) {
return greD.forget();
}
greD->Clone(getter_AddRefs(mGREBinD));
#ifdef XP_MACOSX
nsAutoCString leafName;
mGREBinD->GetNativeLeafName(leafName);
if (leafName.EqualsLiteral("Resources")) {
mGREBinD->SetNativeLeafName("MacOS"_ns);
}
#endif
nsCOMPtr copy = mGREBinD;
return copy.forget();
}
////////////////////////////////////////////////////////////////////////////
//// nsIDirectoryServiceProvider
NS_IMETHODIMP GetFile(const char* aProperty, bool* _persistent,
nsIFile** _result) override {
// If we were supplied a directory service provider, ask it first.
if (mDirSvcProvider && NS_SUCCEEDED(mDirSvcProvider->GetFile(
aProperty, _persistent, _result))) {
return NS_OK;
}
// Otherwise, the test harness provides some directories automatically.
if (0 == strcmp(aProperty, NS_APP_USER_PROFILE_50_DIR) ||
0 == strcmp(aProperty, NS_APP_USER_PROFILE_LOCAL_50_DIR) ||
0 == strcmp(aProperty, NS_APP_PROFILE_LOCAL_DIR_STARTUP)) {
nsCOMPtr profD = GetProfileDirectory();
NS_ENSURE_TRUE(profD, NS_ERROR_FAILURE);
nsCOMPtr clone;
nsresult rv = profD->Clone(getter_AddRefs(clone));
NS_ENSURE_SUCCESS(rv, rv);
*_persistent = true;
clone.forget(_result);
return NS_OK;
} else if (0 == strcmp(aProperty, NS_GRE_DIR)) {
nsCOMPtr greD = GetGREDirectory();
NS_ENSURE_TRUE(greD, NS_ERROR_FAILURE);
*_persistent = true;
greD.forget(_result);
return NS_OK;
} else if (0 == strcmp(aProperty, NS_GRE_BIN_DIR)) {
nsCOMPtr greBinD = GetGREBinDirectory();
NS_ENSURE_TRUE(greBinD, NS_ERROR_FAILURE);
*_persistent = true;
greBinD.forget(_result);
return NS_OK;
}
return NS_ERROR_FAILURE;
}
////////////////////////////////////////////////////////////////////////////
//// nsIDirectoryServiceProvider2
NS_IMETHODIMP GetFiles(const char* aProperty,
nsISimpleEnumerator** _enum) override {
// If we were supplied a directory service provider, ask it first.
nsCOMPtr provider =
do_QueryInterface(mDirSvcProvider);
if (provider && NS_SUCCEEDED(provider->GetFiles(aProperty, _enum))) {
return NS_OK;
}
return NS_ERROR_FAILURE;
}
private:
const char* mTestName;
nsIServiceManager* mServMgr;
nsCOMPtr mDirSvcProvider;
nsCOMPtr mProfD;
nsCOMPtr mGRED;
nsCOMPtr mGREBinD;
};
Minimal test - lines (44, 55)
path: .spaces[0].spaces[0].metrics.nargs.sum
old: 6.0
new: 2.0
path: .spaces[0].spaces[0].metrics.mi.mi_sei
old: -1.5819798676366776
new: 74.55323684761127
path: .spaces[0].spaces[0].metrics.mi.mi_visual_studio
old: 25.2919679892827
new: 60.86410637328522
path: .spaces[0].spaces[0].metrics.mi.mi_original
old: 43.249265261673415
new: 104.07762189831772
path: .spaces[0].spaces[0].metrics.cyclomatic.average
old: 5.25
new: 1.0
path: .spaces[0].spaces[0].metrics.cyclomatic.sum
old: 21.0
new: 1.0
path: .spaces[0].spaces[0].metrics.halstead.length
old: 701.0
new: 38.0
path: .spaces[0].spaces[0].metrics.halstead.N2
old: 283.0
new: 17.0
path: .spaces[0].spaces[0].metrics.halstead.N1
old: 418.0
new: 21.0
path: .spaces[0].spaces[0].metrics.halstead.vocabulary
old: 128.0
new: 19.0
path: .spaces[0].spaces[0].metrics.halstead.time
old: 10311.987623762376
new: 44.46557457359234
path: .spaces[0].spaces[0].metrics.halstead.n1
old: 27.0
new: 7.0
path: .spaces[0].spaces[0].metrics.halstead.purity_ratio
old: 1.1424555239890797
new: 1.6492377490278185
path: .spaces[0].spaces[0].metrics.halstead.estimated_program_length
old: 800.8613223163449
new: 62.6710344630571
path: .spaces[0].spaces[0].metrics.halstead.n2
old: 101.0
new: 12.0
path: .spaces[0].spaces[0].metrics.halstead.bugs
old: 1.0846476278010917
new: 0.02873489984245458
path: .spaces[0].spaces[0].metrics.halstead.difficulty
old: 37.82673267326733
new: 4.958333333333333
path: .spaces[0].spaces[0].metrics.halstead.volume
old: 4907.0
new: 161.42124551085624
path: .spaces[0].spaces[0].metrics.halstead.effort
old: 185615.7772277228
new: 800.3803423246621
path: .spaces[0].spaces[0].metrics.halstead.level
old: 0.026436330323256117
new: 0.20168067226890757
path: .spaces[0].spaces[0].metrics.cognitive.sum
old: 9.0
new: 0.0
path: .spaces[0].spaces[0].metrics.cognitive.average
old: 3.0
new: 0.0
path: .spaces[0].spaces[0].metrics.nom.functions
old: 3.0
new: 1.0
path: .spaces[0].spaces[0].metrics.nom.total
old: 3.0
new: 1.0
path: .spaces[0].spaces[0].metrics.loc.blank
old: 8.0
new: 3.0
path: .spaces[0].spaces[0].metrics.loc.lloc
old: 59.0
new: 6.0
path: .spaces[0].spaces[0].metrics.loc.sloc
old: 129.0
new: 12.0
path: .spaces[0].spaces[0].metrics.loc.cloc
old: 2.0
new: 0.0
path: .spaces[0].spaces[0].metrics.loc.ploc
old: 119.0
new: 9.0
path: .spaces[0].spaces[0].metrics.nexits.average
old: 2.6666666666666665
new: 0.0
path: .spaces[0].spaces[0].metrics.nexits.sum
old: 8.0
new: 0.0
Code
MOZ_FORMAT_PRINTF(1, 2) void fail(const char* msg, ...) {
va_list ap;
printf("TEST-UNEXPECTED-FAIL | ");
va_start(ap, msg);
vprintf(msg, ap);
va_end(ap);
putchar('\n');
++gFailCount;
}