--- /dev/null
+/*
+ * Sonar, open source software quality management tool.
+ * Copyright (C) 2008-2011 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * Sonar is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * Sonar is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Sonar; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
+ */
+package org.sonar.duplications.java;
+
+import java.util.List;
+
+import org.sonar.duplications.statement.matcher.TokenMatcher;
+import org.sonar.duplications.token.Token;
+import org.sonar.duplications.token.TokenQueue;
+
+public class BridgeWithExceptionTokenMatcher extends TokenMatcher {
+
+ private final String lToken;
+ private final String rToken;
+ private final String except;
+
+ public BridgeWithExceptionTokenMatcher(String lToken, String rToken, String except) {
+ if (lToken == null || rToken == null || except == null) {
+ throw new IllegalArgumentException();
+ }
+ this.lToken = lToken;
+ this.rToken = rToken;
+ this.except = except;
+ }
+
+ @Override
+ public boolean matchToken(TokenQueue tokenQueue, List<Token> matchedTokenList) {
+ if (!tokenQueue.isNextTokenValue(lToken)) {
+ return false;
+ }
+ int stack = 0;
+ while (tokenQueue.peek() != null) {
+ Token token = tokenQueue.poll();
+ matchedTokenList.add(token);
+ if (lToken.equals(token.getValue())) {
+ stack++;
+ } else if (rToken.equals(token.getValue())) {
+ stack--;
+ } else if (except.equals(token.getValue())) {
+ return false;
+ }
+ if (stack == 0) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
import static org.hamcrest.number.OrderingComparisons.greaterThan;
import static org.junit.Assert.assertThat;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStreamReader;
-import java.io.Reader;
+import java.io.*;
import java.nio.charset.Charset;
import java.util.List;
@Test
public void shouldHandleArray() {
+ List<Statement> statements = chunk("new Integer[] { 1, 2, 3, 4 };");
+ assertThat(statements.size(), is(2));
+ assertThat(statements.get(0).getValue(), is("newInteger[]"));
+ assertThat(statements.get(1).getValue(), is("{$NUMBER,$NUMBER,$NUMBER,$NUMBER}"));
+ }
+
+ /**
+ * See SONAR-2837
+ */
+ @Test
+ public void shouldHandleMultidimensionalArray() {
List<Statement> statements = chunk("new Integer[][] { { 1, 2 }, {3, 4} };");
- assertThat(statements.size(), is(4));
+ assertThat(statements.size(), is(2));
assertThat(statements.get(0).getValue(), is("newInteger[][]"));
- assertThat(statements.get(1).getValue(), is("$NUMBER,$NUMBER"));
- assertThat(statements.get(2).getValue(), is(","));
- assertThat(statements.get(3).getValue(), is("$NUMBER,$NUMBER"));
+ assertThat(statements.get(1).getValue(), is("{{$NUMBER,$NUMBER},{$NUMBER,$NUMBER}}"));
+
+ statements = chunk("new Integer[][] { null, {3, 4} };");
+ assertThat(statements.size(), is(2));
+ assertThat(statements.get(0).getValue(), is("newInteger[][]"));
+ assertThat(statements.get(1).getValue(), is("{null,{$NUMBER,$NUMBER}}"));
+ }
+
+ @Test
+ public void shouldHandleTryCatch() {
+ List<Statement> statements;
+ statements = chunk("try { } catch (Exception e) { }");
+ assertThat(statements.size(), is(4));
+ assertThat(statements.get(0).getValue(), is("try"));
+ assertThat(statements.get(1).getValue(), is("{}"));
+ assertThat(statements.get(2).getValue(), is("catch(Exceptione)"));
+ assertThat(statements.get(3).getValue(), is("{}"));
+
+ statements = chunk("try { something(); } catch (Exception e) { }");
+ assertThat(statements.size(), is(4));
+ assertThat(statements.get(0).getValue(), is("try"));
+ assertThat(statements.get(1).getValue(), is("something()"));
+ assertThat(statements.get(2).getValue(), is("catch(Exceptione)"));
+ assertThat(statements.get(3).getValue(), is("{}"));
+
+ statements = chunk("try { something(); } catch (Exception e) { onException(); }");
+ assertThat(statements.size(), is(4));
+ assertThat(statements.get(0).getValue(), is("try"));
+ assertThat(statements.get(1).getValue(), is("something()"));
+ assertThat(statements.get(2).getValue(), is("catch(Exceptione)"));
+ assertThat(statements.get(3).getValue(), is("onException()"));
+
+ statements = chunk("try { something(); } catch (Exception1 e) { onException1(); } catch (Exception2 e) { onException2(); }");
+ assertThat(statements.size(), is(6));
+ assertThat(statements.get(0).getValue(), is("try"));
+ assertThat(statements.get(1).getValue(), is("something()"));
+ assertThat(statements.get(2).getValue(), is("catch(Exception1e)"));
+ assertThat(statements.get(3).getValue(), is("onException1()"));
+ assertThat(statements.get(4).getValue(), is("catch(Exception2e)"));
+ assertThat(statements.get(5).getValue(), is("onException2()"));
+ }
+
+ @Test
+ public void shouldHandleTryFinnaly() {
+ List<Statement> statements;
+ statements = chunk("try { } finally { }");
+ assertThat(statements.size(), is(4));
+ assertThat(statements.get(0).getValue(), is("try"));
+ assertThat(statements.get(1).getValue(), is("{}"));
+ assertThat(statements.get(2).getValue(), is("finally"));
+ assertThat(statements.get(3).getValue(), is("{}"));
+
+ statements = chunk("try { something(); } finally { }");
+ assertThat(statements.size(), is(4));
+ assertThat(statements.get(0).getValue(), is("try"));
+ assertThat(statements.get(1).getValue(), is("something()"));
+ assertThat(statements.get(2).getValue(), is("finally"));
+ assertThat(statements.get(3).getValue(), is("{}"));
+
+ statements = chunk("try { something(); } finally { somethingOther(); }");
+ assertThat(statements.size(), is(4));
+ assertThat(statements.get(0).getValue(), is("try"));
+ assertThat(statements.get(1).getValue(), is("something()"));
+ assertThat(statements.get(2).getValue(), is("finally"));
+ assertThat(statements.get(3).getValue(), is("somethingOther()"));
+ }
+
+ @Test
+ public void shouldHandleTryCatchFinally() {
+ List<Statement> statements;
+ statements = chunk("try { } catch (Exception e) {} finally { }");
+ assertThat(statements.size(), is(6));
+ assertThat(statements.get(0).getValue(), is("try"));
+ assertThat(statements.get(1).getValue(), is("{}"));
+ assertThat(statements.get(2).getValue(), is("catch(Exceptione)"));
+ assertThat(statements.get(3).getValue(), is("{}"));
+ assertThat(statements.get(4).getValue(), is("finally"));
+ assertThat(statements.get(5).getValue(), is("{}"));
+
+ statements = chunk("try { something(); } catch (Exception e) { onException(); } finally { somethingOther(); }");
+ assertThat(statements.size(), is(6));
+ assertThat(statements.get(0).getValue(), is("try"));
+ assertThat(statements.get(1).getValue(), is("something()"));
+ assertThat(statements.get(2).getValue(), is("catch(Exceptione)"));
+ assertThat(statements.get(3).getValue(), is("onException()"));
+ assertThat(statements.get(4).getValue(), is("finally"));
+ assertThat(statements.get(5).getValue(), is("somethingOther()"));
+ }
+
+ /**
+ * Java 7.
+ */
+ @Test
+ public void shouldHandleMultiCatch() {
+ List<Statement> statements;
+ statements = chunk("try { } catch (Exception1 | Exception2 e) { }");
+ assertThat(statements.size(), is(4));
+ assertThat(statements.get(0).getValue(), is("try"));
+ assertThat(statements.get(1).getValue(), is("{}"));
+ assertThat(statements.get(2).getValue(), is("catch(Exception1|Exception2e)"));
+ assertThat(statements.get(3).getValue(), is("{}"));
+
+ statements = chunk("try { something(); } catch (Exception1 | Exception2 e) { }");
+ assertThat(statements.size(), is(4));
+ assertThat(statements.get(0).getValue(), is("try"));
+ assertThat(statements.get(1).getValue(), is("something()"));
+ assertThat(statements.get(2).getValue(), is("catch(Exception1|Exception2e)"));
+ assertThat(statements.get(3).getValue(), is("{}"));
+
+ statements = chunk("try { something(); } catch (Exception1 | Exception2 e) { onException(); }");
+ assertThat(statements.size(), is(4));
+ assertThat(statements.get(0).getValue(), is("try"));
+ assertThat(statements.get(1).getValue(), is("something()"));
+ assertThat(statements.get(2).getValue(), is("catch(Exception1|Exception2e)"));
+ assertThat(statements.get(3).getValue(), is("onException()"));
}
@Test