NodeListTest.java revision 15c2aa05f936720e8f7efdedbbc68450a6f27fb3
1/* 2 * Copyright (C) 2007-2010 Júlio Vilmar Gesser. 3 * Copyright (C) 2011, 2013-2016 The JavaParser Team. 4 * 5 * This file is part of JavaParser. 6 * 7 * JavaParser can be used either under the terms of 8 * a) the GNU Lesser General Public License as published by 9 * the Free Software Foundation, either version 3 of the License, or 10 * (at your option) any later version. 11 * b) the terms of the Apache License 12 * 13 * You should have received a copy of both licenses in LICENCE.LGPL and 14 * LICENCE.APACHE. Please refer to those files for details. 15 * 16 * JavaParser is distributed in the hope that it will be useful, 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 * GNU Lesser General Public License for more details. 20 */ 21 22package com.github.javaparser.ast; 23 24import com.github.javaparser.JavaParser; 25import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; 26import com.github.javaparser.ast.body.FieldDeclaration; 27import com.github.javaparser.ast.expr.SimpleName; 28import com.github.javaparser.ast.observer.AstObserver; 29import com.github.javaparser.ast.observer.ObservableProperty; 30import com.github.javaparser.ast.type.PrimitiveType; 31import org.junit.Test; 32 33import java.util.Arrays; 34import java.util.EnumSet; 35import java.util.LinkedList; 36import java.util.List; 37 38import static org.junit.Assert.assertEquals; 39 40public class NodeListTest { 41 42 private AstObserver createObserver(List<String> changes) { 43 return new AstObserver() { 44 @Override 45 public void propertyChange(Node observedNode, ObservableProperty property, Object oldValue, Object newValue) { 46 changes.add(String.format("change of property %s for %s: from '%s' to '%s'", property, observedNode, oldValue, newValue)); 47 } 48 49 @Override 50 public void parentChange(Node observedNode, Node previousParent, Node newParent) { 51 changes.add(String.format("setting parent for %s: was %s, now is %s", observedNode, previousParent, newParent)); 52 } 53 54 @Override 55 public void listChange(NodeList observedNode, ListChangeType type, int index, Node nodeAddedOrRemoved) { 56 changes.add(String.format("'%s' %s in list at %d", nodeAddedOrRemoved, type, index)); 57 } 58 }; 59 } 60 61 private FieldDeclaration createIntField(String name) { 62 return new FieldDeclaration(EnumSet.noneOf(Modifier.class), PrimitiveType.intType(), name); 63 } 64 65 @Test 66 public void addAllWithoutIndex() { 67 List<String> changes = new LinkedList<>(); 68 String code = "class A { void foo(int p) { }}"; 69 CompilationUnit cu = JavaParser.parse(code); 70 ClassOrInterfaceDeclaration cd = cu.getClassByName("A"); 71 cd.getMembers().register(createObserver(changes)); 72 73 cd.getMembers().addAll(Arrays.asList(createIntField("a"), createIntField("b"), createIntField("c"))); 74 assertEquals(Arrays.asList("'int a;' ADDITION in list at 1", 75 "'int b;' ADDITION in list at 2", 76 "'int c;' ADDITION in list at 3"), changes); 77 } 78 79 @Test 80 public void addAllWithIndex() { 81 List<String> changes = new LinkedList<>(); 82 String code = "class A { void foo(int p) { }}"; 83 CompilationUnit cu = JavaParser.parse(code); 84 ClassOrInterfaceDeclaration cd = cu.getClassByName("A"); 85 cd.getMembers().register(createObserver(changes)); 86 87 cd.getMembers().addAll(0, Arrays.asList(createIntField("a"), createIntField("b"), createIntField("c"))); 88 assertEquals(Arrays.asList("'int a;' ADDITION in list at 0", 89 "'int b;' ADDITION in list at 1", 90 "'int c;' ADDITION in list at 2"), changes); 91 } 92 93 @Test 94 public void clear() { 95 List<String> changes = new LinkedList<>(); 96 String code = "class A { int a; int b; int c; }"; 97 CompilationUnit cu = JavaParser.parse(code); 98 ClassOrInterfaceDeclaration cd = cu.getClassByName("A"); 99 cd.getMembers().register(createObserver(changes)); 100 101 cd.getMembers().clear(); 102 assertEquals(Arrays.asList("'int a;' REMOVAL in list at 0", 103 "'int b;' REMOVAL in list at 0", 104 "'int c;' REMOVAL in list at 0"), changes); 105 } 106 107 @Test 108 public void set() { 109 List<String> changes = new LinkedList<>(); 110 String code = "class A { int a; int b; int c; }"; 111 CompilationUnit cu = JavaParser.parse(code); 112 ClassOrInterfaceDeclaration cd = cu.getClassByName("A"); 113 cd.getMembers().register(createObserver(changes)); 114 115 cd.getMembers().set(1, createIntField("d")); 116 assertEquals(Arrays.asList("'int b;' REMOVAL in list at 1", 117 "'int d;' ADDITION in list at 1"), changes); 118 } 119 120 @Test 121 public void removeNode() { 122 List<String> changes = new LinkedList<>(); 123 String code = "class A { int a; int b; int c; int d; int e; }"; 124 CompilationUnit cu = JavaParser.parse(code); 125 ClassOrInterfaceDeclaration cd = cu.getClassByName("A"); 126 cd.getMembers().register(createObserver(changes)); 127 128 cd.getMembers().remove(cd.getFieldByName("c")); 129 assertEquals(Arrays.asList("'int c;' REMOVAL in list at 2"), changes); 130 } 131 132 @Test 133 public void removeObject() { 134 List<String> changes = new LinkedList<>(); 135 String code = "class A { int a; int b; int c; int d; int e; }"; 136 CompilationUnit cu = JavaParser.parse(code); 137 ClassOrInterfaceDeclaration cd = cu.getClassByName("A"); 138 cd.getMembers().register(createObserver(changes)); 139 140 cd.getMembers().remove("hi"); 141 assertEquals(Arrays.asList(), changes); 142 } 143 144 @Test 145 public void removeAll() { 146 List<String> changes = new LinkedList<>(); 147 String code = "class A { int a; int b; int c; int d; int e; }"; 148 CompilationUnit cu = JavaParser.parse(code); 149 ClassOrInterfaceDeclaration cd = cu.getClassByName("A"); 150 cd.getMembers().register(createObserver(changes)); 151 152 cd.getMembers().removeAll(Arrays.asList(cd.getFieldByName("b"), "foo", cd.getFieldByName("d"))); 153 assertEquals(Arrays.asList("'int b;' REMOVAL in list at 1", 154 "'int d;' REMOVAL in list at 2"), changes); 155 } 156 157 @Test 158 public void retainAll() { 159 List<String> changes = new LinkedList<>(); 160 String code = "class A { int a; int b; int c; int d; int e; }"; 161 CompilationUnit cu = JavaParser.parse(code); 162 ClassOrInterfaceDeclaration cd = cu.getClassByName("A"); 163 cd.getMembers().register(createObserver(changes)); 164 165 cd.getMembers().retainAll(Arrays.asList(cd.getFieldByName("b"), "foo", cd.getFieldByName("d"))); 166 assertEquals(Arrays.asList("'int a;' REMOVAL in list at 0", 167 "'int c;' REMOVAL in list at 1", 168 "'int e;' REMOVAL in list at 2"), changes); 169 } 170 171 @Test 172 public void replaceAll() { 173 List<String> changes = new LinkedList<>(); 174 String code = "class A { int a; int b; int c; }"; 175 CompilationUnit cu = JavaParser.parse(code); 176 ClassOrInterfaceDeclaration cd = cu.getClassByName("A"); 177 cd.getMembers().register(createObserver(changes)); 178 179 cd.getMembers().replaceAll(bodyDeclaration -> { 180 FieldDeclaration clone = (FieldDeclaration) bodyDeclaration.clone(); 181 SimpleName id = clone.getVariable(0).getName(); 182 id.setIdentifier(id.getIdentifier().toUpperCase()); 183 return clone; 184 }); 185 assertEquals(Arrays.asList("'int a;' REMOVAL in list at 0", "'int A;' ADDITION in list at 0", 186 "'int b;' REMOVAL in list at 1", "'int B;' ADDITION in list at 1", 187 "'int c;' REMOVAL in list at 2", "'int C;' ADDITION in list at 2"), changes); 188 } 189 190 @Test 191 public void removeIf() { 192 List<String> changes = new LinkedList<>(); 193 String code = "class A { int a; int longName; int c; }"; 194 CompilationUnit cu = JavaParser.parse(code); 195 ClassOrInterfaceDeclaration cd = cu.getClassByName("A"); 196 cd.getMembers().register(createObserver(changes)); 197 198 cd.getMembers().removeIf(m -> ((FieldDeclaration) m).getVariable(0).getName().getIdentifier().length() > 3); 199 assertEquals(Arrays.asList("'int longName;' REMOVAL in list at 1"), changes); 200 } 201} 202