From e725eef7d297187f9c356c9e85eee858eece3bf8 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Thu, 31 Jan 2013 17:28:26 +0100 Subject: [PATCH] SONAR-4094 Display tests in a select box --- .../resources/org/sonar/l10n/core.properties | 1 + .../org/sonar/core/test/DefaultTestCase.java | 13 +++++++++++ .../org/sonar/core/test/DefaultTestable.java | 9 ++++++++ .../sonar/core/test/DefaultTestCaseTest.java | 22 +++++++++++++++++++ .../sonar/core/test/DefaultTestableTest.java | 21 ++++++++++++++++++ .../java/org/sonar/api/test/TestCase.java | 2 ++ .../java/org/sonar/api/test/Testable.java | 2 ++ .../app/controllers/resource_controller.rb | 10 +++++++-- .../app/controllers/test_controller.rb | 2 +- .../app/views/resource/_options.html.erb | 12 ++++++++++ 10 files changed, 91 insertions(+), 3 deletions(-) diff --git a/plugins/sonar-core-plugin/src/main/resources/org/sonar/l10n/core.properties b/plugins/sonar-core-plugin/src/main/resources/org/sonar/l10n/core.properties index 87f6f5a535d..d92f8379b28 100644 --- a/plugins/sonar-core-plugin/src/main/resources/org/sonar/l10n/core.properties +++ b/plugins/sonar-core-plugin/src/main/resources/org/sonar/l10n/core.properties @@ -1131,6 +1131,7 @@ overall_coverage_viewer.by=by all tests coverage_viewer.unit_tests=Unit Tests coverage_viewer.integration_tests=Integration Tests coverage_viewer.overall_tests=All Tests +lines_covered_per_test=Lines covered per test #------------------------------------------------------------------------------ diff --git a/sonar-core/src/main/java/org/sonar/core/test/DefaultTestCase.java b/sonar-core/src/main/java/org/sonar/core/test/DefaultTestCase.java index b602e725a2c..1856135585a 100644 --- a/sonar-core/src/main/java/org/sonar/core/test/DefaultTestCase.java +++ b/sonar-core/src/main/java/org/sonar/core/test/DefaultTestCase.java @@ -19,9 +19,12 @@ */ package org.sonar.core.test; +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; import com.tinkerpop.blueprints.Direction; import com.tinkerpop.blueprints.Edge; import com.tinkerpop.blueprints.Vertex; +import org.sonar.api.test.Cover; import org.sonar.api.test.MutableTestCase; import org.sonar.api.test.TestPlan; import org.sonar.api.test.Testable; @@ -120,4 +123,14 @@ public class DefaultTestCase extends BeanVertex implements MutableTestCase { public Iterable covers() { return getEdges(DefaultCover.class, Direction.OUT, "covers"); } + + public Cover coverOfTestable(final Testable testable) { + return Iterables.find(getEdges(DefaultCover.class, Direction.OUT, "covers"), new Predicate() { + public boolean apply(Cover input) { + return input.testable().component().key().equals(testable.component().key()); + } + }, null); + } + + } diff --git a/sonar-core/src/main/java/org/sonar/core/test/DefaultTestable.java b/sonar-core/src/main/java/org/sonar/core/test/DefaultTestable.java index ca5244ad7af..c1cd1ee24e3 100644 --- a/sonar-core/src/main/java/org/sonar/core/test/DefaultTestable.java +++ b/sonar-core/src/main/java/org/sonar/core/test/DefaultTestable.java @@ -19,6 +19,7 @@ */ package org.sonar.core.test; +import com.google.common.base.Predicate; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSortedSet; import com.google.common.collect.Iterables; @@ -51,6 +52,14 @@ public class DefaultTestable extends BeanVertex implements MutableTestable { return cases.build(); } + public TestCase testCaseByKey(final String key) { + return Iterables.find(testCases(), new Predicate() { + public boolean apply(TestCase input) { + return input.key().equals(key); + } + }, null); + } + public int countTestCasesOfLine(int line) { int number = 0; // TODO filter on edge diff --git a/sonar-core/src/test/java/org/sonar/core/test/DefaultTestCaseTest.java b/sonar-core/src/test/java/org/sonar/core/test/DefaultTestCaseTest.java index d6bf3168e10..212216dcf5d 100644 --- a/sonar-core/src/test/java/org/sonar/core/test/DefaultTestCaseTest.java +++ b/sonar-core/src/test/java/org/sonar/core/test/DefaultTestCaseTest.java @@ -23,9 +23,12 @@ import com.google.common.collect.Iterables; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; +import org.sonar.api.component.mock.MockSourceFile; import org.sonar.api.test.Cover; import org.sonar.api.test.TestCase; import org.sonar.api.test.exception.IllegalDurationException; +import org.sonar.core.component.ComponentVertex; +import org.sonar.core.component.ScanGraph; import org.sonar.core.graph.BeanGraph; import java.util.Arrays; @@ -79,6 +82,25 @@ public class DefaultTestCaseTest { assertThat(testCase.covers()).hasSize(2); } + @Test + public void should_return_cover_of_testable(){ + BeanGraph beanGraph = BeanGraph.createInMemory(); + + ScanGraph graph = ScanGraph.create(); + ComponentVertex file1 = graph.addComponent(MockSourceFile.createMain("org.foo.Bar")); + DefaultTestable testable1 = beanGraph.createAdjacentVertex(file1, DefaultTestable.class, "testable"); + + ComponentVertex file2 = graph.addComponent(MockSourceFile.createMain("org.foo.File")); + DefaultTestable testable2 = beanGraph.createAdjacentVertex(file2, DefaultTestable.class, "testable"); + + DefaultTestCase testCase = beanGraph.createVertex(DefaultTestCase.class); + testCase.setCover(testable1, Arrays.asList(10, 11, 12)); + + assertThat(testCase.coverOfTestable(testable1).testable()).isEqualTo(testable1); + assertThat(testCase.coverOfTestable(testable1).testCase()).isEqualTo(testCase); + assertThat(testCase.coverOfTestable(testable2)).isNull(); + } + @Test public void should_set_metadata() { BeanGraph beanGraph = BeanGraph.createInMemory(); diff --git a/sonar-core/src/test/java/org/sonar/core/test/DefaultTestableTest.java b/sonar-core/src/test/java/org/sonar/core/test/DefaultTestableTest.java index 962902be5b7..1d020084041 100644 --- a/sonar-core/src/test/java/org/sonar/core/test/DefaultTestableTest.java +++ b/sonar-core/src/test/java/org/sonar/core/test/DefaultTestableTest.java @@ -19,7 +19,9 @@ */ package org.sonar.core.test; +import com.google.common.collect.Iterables; import org.junit.Test; +import org.sonar.api.test.MutableTestCase; import org.sonar.core.graph.BeanGraph; import java.util.Arrays; @@ -66,4 +68,23 @@ public class DefaultTestableTest { assertThat(testable.testCasesOfLine(10)).containsExactly(testCase1); assertThat(testable.testCasesOfLine(12)).contains(testCase1, testCase2); } + + @Test + public void should_get_test_case_by_key() { + BeanGraph beanGraph = BeanGraph.createInMemory(); + + DefaultTestPlan plan = beanGraph.createVertex(DefaultTestPlan.class); + plan.addTestCase("T1"); + plan.addTestCase("T2"); + + DefaultTestable testable = beanGraph.createVertex(DefaultTestable.class); + MutableTestCase testCase1 = Iterables.get(plan.testCases(), 0); + testCase1.setCover(testable, Arrays.asList(10, 11, 12)); + MutableTestCase testCase2 = Iterables.get(plan.testCases(), 1); + testCase2.setCover(testable, Arrays.asList(12, 48, 49)); + + assertThat(testable.testCaseByKey("T1")).isEqualTo(testCase1); + assertThat(testable.testCaseByKey("T2")).isEqualTo(testCase2); + assertThat(testable.testCaseByKey("Unknown")).isNull(); + } } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/test/TestCase.java b/sonar-plugin-api/src/main/java/org/sonar/api/test/TestCase.java index 75ad3fb7073..168b07ad189 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/test/TestCase.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/test/TestCase.java @@ -49,4 +49,6 @@ public interface TestCase { int countCoveredLines(); Iterable covers(); + + Cover coverOfTestable(Testable testable); } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/test/Testable.java b/sonar-plugin-api/src/main/java/org/sonar/api/test/Testable.java index a4eb95306aa..3c33dafec8e 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/test/Testable.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/test/Testable.java @@ -28,6 +28,8 @@ public interface Testable extends Perspective { List testCases(); + TestCase testCaseByKey(String key); + int countTestCasesOfLine(int line); List testCasesOfLine(int line); diff --git a/sonar-server/src/main/webapp/WEB-INF/app/controllers/resource_controller.rb b/sonar-server/src/main/webapp/WEB-INF/app/controllers/resource_controller.rb index d8608ee50c3..8899163c3b6 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/controllers/resource_controller.rb +++ b/sonar-server/src/main/webapp/WEB-INF/app/controllers/resource_controller.rb @@ -191,12 +191,12 @@ class ResourceController < ApplicationController @conditions_by_line = load_distribution("#{it_prefix}conditions_by_line") @covered_conditions_by_line = load_distribution("#{it_prefix}covered_conditions_by_line") - testable = java_facade.getTestable(@snapshot.id) + @testable = java_facade.getTestable(@snapshot.id) @hits_by_line.each_pair do |line_id, hits| line = @lines[line_id-1] if line line.covered_lines = 0 - line.covered_lines = testable.countTestCasesOfLine(line_id) if testable + line.covered_lines = @testable.countTestCasesOfLine(line_id) if @testable line.hits = hits.to_i line.conditions = @conditions_by_line[line_id].to_i line.covered_conditions = @covered_conditions_by_line[line_id].to_i @@ -248,6 +248,12 @@ class ResourceController < ApplicationController end end + @test_case_filter = params[:test_case_filter] + if @test_case_filter && @testable + #lines = @testable.coverOfTestable(@testable.testCaseByKey(@test_case_filter)).lines + #filter_lines { |line| lines.include? line } + end + render :action => 'index', :layout => !request.xhr? end diff --git a/sonar-server/src/main/webapp/WEB-INF/app/controllers/test_controller.rb b/sonar-server/src/main/webapp/WEB-INF/app/controllers/test_controller.rb index 8ba64c92996..16a109bbdfa 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/controllers/test_controller.rb +++ b/sonar-server/src/main/webapp/WEB-INF/app/controllers/test_controller.rb @@ -20,7 +20,7 @@ class TestController < ApplicationController def working_view - #verify_ajax_request + verify_ajax_request require_parameters :sid, :value, :type type = params[:type].to_s snapshot_id = params[:sid].to_i diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/resource/_options.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/resource/_options.html.erb index 34d774f440c..ffef6a7b759 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/views/resource/_options.html.erb +++ b/sonar-server/src/main/webapp/WEB-INF/app/views/resource/_options.html.erb @@ -91,6 +91,18 @@ <% end %> + + <% if @testable && !@testable.testCases.empty? %> + + + + <% end %> + <% first=false end %> -- 2.39.5