Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add untracked metrics to suspiciousMetricsHelper.ts #2962 #2996

Merged
merged 12 commits into from
Aug 31, 2022
Merged
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/)
- Correct file types now get appended to the name of the output file when using the interactive ccsh [#2914](https://github.com/MaibornWolff/codecharta/pull/2914)
- Fix exit code handling and update integrationTest's golden_test.sh to cover all modules [#2988](https://github.com/MaibornWolff/codecharta/pull/2988)
- Fix missing color pickers within edge metric options [#2993](https://github.com/MaibornWolff/codecharta/pull/2993)
- Provides a list of metrics where no calculation could be performed in relation to a suspicion [#2996](https://github.com/MaibornWolff/codecharta/pull/2996)<br/>![missing_values_suspicious_metrics](https://user-images.githubusercontent.com/31436472/187439165-77eda080-ceba-4bab-b077-4f6a2d6162b5.png)

### Chore 👨‍💻 👩‍💻

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,28 +43,44 @@
<span ng-show="!$ctrl.viewModel.analyzedProgrammingLanguage.length"> Suspicious Metrics (click below to view) </span>
</md-menu-item>

<ul class="suspicious-metrics">
<li class="suspicious-metric" ng-repeat="item in $ctrl.viewModel.suspiciousMetricSuggestionLinks">
<md-button
class="metric-button"
ng-click="$ctrl.applySuspiciousMetric(item, false)"
title="Apply Map Configuration to show files with suspicious metric {{
item.metric
}} and high risk or very high risk depending on selection"
>
Suspicious {{ item.metric.toUpperCase() }} Files
</md-button>
<md-menu-item ng-show="$ctrl.viewModel.suspiciousMetricSuggestionLinks.length">
<ul class="suspicious-metrics">
<li class="suspicious-metric" ng-repeat="item in $ctrl.viewModel.suspiciousMetricSuggestionLinks">
<md-button
class="metric-button"
ng-click="$ctrl.applySuspiciousMetric(item, false)"
title="Apply Map Configuration to show files with suspicious metric {{
item.metric
}} and high risk or very high risk depending on selection"
>
Suspicious {{ item.metric.toUpperCase() }} Files
</md-button>

<md-button
class="risk-button"
ng-click="$ctrl.applySuspiciousMetric(item, true)"
ng-show="item.isOutlier"
title="Show very high risk files"
>
<i class="fa fa-exclamation-triangle"></i>
</md-button>
</li>
</ul>
<md-button
class="risk-button"
ng-click="$ctrl.applySuspiciousMetric(item, true)"
ng-show="item.isOutlier"
title="Show very high risk files"
>
<i class="fa fa-exclamation-triangle"></i>
</md-button>
</li>
</ul>
</md-menu-item>

<md-menu-item class="title" ng-show="$ctrl.viewModel.untrackedMetrics.length">
<span
ng-show="$ctrl.viewModel.analyzedProgrammingLanguage.length"
title="The following metrics are not covered by this feature, so no finding could be made."
>
Untracked metrics in {{ $ctrl.viewModel.analyzedProgrammingLanguage }} code
</span>
</md-menu-item>
<md-menu-item ng-show="$ctrl.viewModel.untrackedMetrics.length">
<ul>
<li ng-repeat="untrackedMetric in $ctrl.viewModel.untrackedMetrics">{{ untrackedMetric }}</li>
</ul>
</md-menu-item>
</md-menu-content>
</md-menu>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ export class ArtificialIntelligenceController implements StoreSubscriber {
analyzedProgrammingLanguage: undefined,
suspiciousMetricSuggestionLinks: [],
unsuspiciousMetrics: [],
untrackedMetrics: [],
riskProfile: { lowRisk: 0, moderateRisk: 0, highRisk: 0, veryHighRisk: 0 }
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,27 @@ describe("ArtificialIntelligenceSelector", () => {
{ from: 29, isOutlier: true, metric: "functions", to: 44 },
{ from: 48, metric: "mcc", to: 71 }
],
unsuspiciousMetrics: ["rloc (real lines of code)"]
unsuspiciousMetrics: ["rloc (real lines of code)"],
untrackedMetrics: []
})
})

it("should return untracked metrics when experimental features are enabled ", () => {
VALID_NODE_JAVA.children[0].children.map(object => {
object.attributes.unknownMetric = 2569
})
const actual = calculate(true, { unifiedMapNode: VALID_NODE_JAVA }, [])

expect(actual).toEqual({
analyzedProgrammingLanguage: "java",
riskProfile: { highRisk: 37, lowRisk: 46, moderateRisk: 17, veryHighRisk: 0 },
suspiciousMetricSuggestionLinks: [
{ from: 365, isOutlier: true, metric: "loc", to: 554 },
{ from: 29, isOutlier: true, metric: "functions", to: 44 },
{ from: 48, metric: "mcc", to: 71 }
],
unsuspiciousMetrics: ["rloc (real lines of code)"],
untrackedMetrics: ["unknownMetric"]
})
})

Expand All @@ -42,7 +62,8 @@ describe("ArtificialIntelligenceSelector", () => {
veryHighRisk: 0
},
suspiciousMetricSuggestionLinks: [],
unsuspiciousMetrics: []
unsuspiciousMetrics: [],
untrackedMetrics: []
})
})
})
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ export interface ArtificialIntelligenceControllerViewModel {
analyzedProgrammingLanguage: string
suspiciousMetricSuggestionLinks: MetricSuggestionParameters[]
unsuspiciousMetrics: string[]
untrackedMetrics: string[]
riskProfile: RiskProfile
}

Expand All @@ -43,6 +44,7 @@ export const calculate = (
analyzedProgrammingLanguage: undefined,
suspiciousMetricSuggestionLinks: [],
unsuspiciousMetrics: [],
untrackedMetrics: [],
riskProfile: { lowRisk: 0, moderateRisk: 0, highRisk: 0, veryHighRisk: 0 }
}

Expand Down Expand Up @@ -75,6 +77,7 @@ export const calculate = (
if (mainProgrammingLanguage !== undefined) {
const metricAssessmentResults = findGoodAndBadMetrics(metricValuesByLanguage, mainProgrammingLanguage)
artificialIntelligenceViewModel.unsuspiciousMetrics = metricAssessmentResults.unsuspiciousMetrics
artificialIntelligenceViewModel.untrackedMetrics = metricAssessmentResults.untrackedMetrics
artificialIntelligenceViewModel.suspiciousMetricSuggestionLinks = calculateSuspiciousMetrics(metricAssessmentResults)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,8 @@ describe("suspiciousMetricsHelper", () => {
const expectedMetricAssessmentResults: MetricAssessmentResults = {
suspiciousMetrics: new Map<string, ColorRange>([["rloc", expectedColorRange]]),
unsuspiciousMetrics: ["functions (number of functions)"],
outliersThresholds: new Map<string, number>([["rloc", metricThresholdsByLanguage.java.rloc.percentile90]])
outliersThresholds: new Map<string, number>([["rloc", metricThresholdsByLanguage.java.rloc.percentile90]]),
untrackedMetrics: []
}

const actualAssessmentResults: MetricAssessmentResults = findGoodAndBadMetrics(metricValuesByLanguage, "java")
Expand Down Expand Up @@ -122,7 +123,8 @@ describe("suspiciousMetricsHelper", () => {
expect(actualAssessmentResults).toEqual({
suspiciousMetrics: new Map<string, ColorRange>(),
unsuspiciousMetrics: [],
outliersThresholds: new Map<string, number>()
outliersThresholds: new Map<string, number>(),
untrackedMetrics: []
})
})

Expand All @@ -135,7 +137,8 @@ describe("suspiciousMetricsHelper", () => {
expect(actualAssessmentResults).toEqual({
suspiciousMetrics: new Map<string, ColorRange>(),
unsuspiciousMetrics: ["rloc (real lines of code)", "cognitive_complexity"],
outliersThresholds: new Map<string, number>()
outliersThresholds: new Map<string, number>(),
untrackedMetrics: []
})
})

Expand All @@ -147,7 +150,8 @@ describe("suspiciousMetricsHelper", () => {
const metricAssessmentResults: MetricAssessmentResults = {
suspiciousMetrics: new Map([["mcc", colorRange]]),
unsuspiciousMetrics: [],
outliersThresholds: new Map([["mcc", 1000]])
outliersThresholds: new Map([["mcc", 1000]]),
untrackedMetrics: []
}

const actualMetricSuggestionParameter = calculateSuspiciousMetrics(metricAssessmentResults)
Expand Down Expand Up @@ -177,7 +181,8 @@ describe("suspiciousMetricsHelper", () => {
outliersThresholds: new Map([
["mcc", 1000],
["loc", 2000]
])
]),
untrackedMetrics: []
}

const actualMetricSuggestionParameter = calculateSuspiciousMetrics(metricAssessmentResults)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export interface MetricAssessmentResults {
suspiciousMetrics: Map<string, ColorRange>
unsuspiciousMetrics: string[]
outliersThresholds: Map<string, number>
untrackedMetrics: string[]
}

export interface MetricSuggestionParameters {
Expand Down Expand Up @@ -77,13 +78,20 @@ export function findGoodAndBadMetrics(
const metricAssessmentResults: MetricAssessmentResults = {
suspiciousMetrics: new Map<string, ColorRange>(),
unsuspiciousMetrics: [],
outliersThresholds: new Map<string, number>()
outliersThresholds: new Map<string, number>(),
untrackedMetrics: []
}

const languageSpecificMetricThresholds = getAssociatedMetricThresholds(mainProgrammingLanguage)
const [availableMapMetrics, assessmentMetricList] = [[], []]

for (const key in metricValuesByLanguages[mainProgrammingLanguage]) {
availableMapMetrics.push(key)
}

for (const metricName of Object.keys(languageSpecificMetricThresholds)) {
const valuesOfMetric = metricValuesByLanguages[mainProgrammingLanguage]?.[metricName]
assessmentMetricList.push(metricName)
if (valuesOfMetric === undefined) {
continue
}
Expand All @@ -105,5 +113,8 @@ export function findGoodAndBadMetrics(
}
}

const untrackedMetrics = availableMapMetrics.filter(metric => !assessmentMetricList.includes(metric))
Array.prototype.push.apply(metricAssessmentResults.untrackedMetrics, untrackedMetrics)
jannikr marked this conversation as resolved.
Show resolved Hide resolved

return metricAssessmentResults
}