NodeListTest.java revision 24a58469927e0faee2d29a628467e998ed491449
13e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassettipackage com.github.javaparser.ast; 23e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti 33e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassettiimport com.github.javaparser.JavaParser; 43e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassettiimport com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; 53e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassettiimport com.github.javaparser.ast.body.FieldDeclaration; 624a58469927e0faee2d29a628467e998ed491449Danny van Bruggenimport com.github.javaparser.ast.expr.SimpleName; 73e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassettiimport com.github.javaparser.ast.observing.AstObserver; 83e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassettiimport com.github.javaparser.ast.observing.ObservableProperty; 93e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassettiimport com.github.javaparser.ast.type.PrimitiveType; 103e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassettiimport org.junit.Test; 113e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti 124296abb695b767f7471dd255d0679516183b062aDanny van Bruggenimport java.util.Arrays; 134296abb695b767f7471dd255d0679516183b062aDanny van Bruggenimport java.util.EnumSet; 144296abb695b767f7471dd255d0679516183b062aDanny van Bruggenimport java.util.LinkedList; 154296abb695b767f7471dd255d0679516183b062aDanny van Bruggenimport java.util.List; 163e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti 173e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassettiimport static org.junit.Assert.assertEquals; 183e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti 193e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassettipublic class NodeListTest { 203e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti 213e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti private AstObserver createObserver(List<String> changes) { 223e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti return new AstObserver() { 233e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti @Override 243e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti public void propertyChange(Node observedNode, ObservableProperty property, Object oldValue, Object newValue) { 254296abb695b767f7471dd255d0679516183b062aDanny van Bruggen changes.add(String.format("change of property %s for %s: from '%s' to '%s'", property, observedNode, oldValue, newValue)); 263e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti } 273e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti 283e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti @Override 293e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti public void parentChange(Node observedNode, Node previousParent, Node newParent) { 303e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti changes.add(String.format("setting parent for %s: was %s, now is %s", observedNode, previousParent, newParent)); 313e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti } 323e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti 333e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti @Override 343e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti public void listChange(NodeList observedNode, ListChangeType type, int index, Node nodeAddedOrRemoved) { 35c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti changes.add(String.format("'%s' %s in list at %d", nodeAddedOrRemoved, type, index)); 363e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti } 373e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti }; 383e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti } 393e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti 403e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti private FieldDeclaration createIntField(String name) { 413e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti return new FieldDeclaration(EnumSet.noneOf(Modifier.class), PrimitiveType.INT_TYPE, name); 423e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti } 433e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti 443e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti @Test 453e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti public void addAllWithoutIndex() { 463e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti List<String> changes = new LinkedList<>(); 473e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti String code = "class A { void foo(int p) { }}"; 483e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti CompilationUnit cu = JavaParser.parse(code); 493e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti ClassOrInterfaceDeclaration cd = cu.getClassByName("A"); 503e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti cd.getMembers().register(createObserver(changes)); 513e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti 523e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti cd.getMembers().addAll(Arrays.asList(createIntField("a"), createIntField("b"), createIntField("c"))); 53c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti assertEquals(Arrays.asList("'int a;' ADDITION in list at 1", 54c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti "'int b;' ADDITION in list at 2", 55c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti "'int c;' ADDITION in list at 3"), changes); 563e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti } 57150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti 58150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti @Test 59150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti public void addAllWithIndex() { 60150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti List<String> changes = new LinkedList<>(); 61150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti String code = "class A { void foo(int p) { }}"; 62150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti CompilationUnit cu = JavaParser.parse(code); 63150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti ClassOrInterfaceDeclaration cd = cu.getClassByName("A"); 64150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti cd.getMembers().register(createObserver(changes)); 65150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti 66150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti cd.getMembers().addAll(0, Arrays.asList(createIntField("a"), createIntField("b"), createIntField("c"))); 67c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti assertEquals(Arrays.asList("'int a;' ADDITION in list at 0", 68c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti "'int b;' ADDITION in list at 1", 69c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti "'int c;' ADDITION in list at 2"), changes); 70150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti } 714a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti 724a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti @Test 734a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti public void clear() { 744a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti List<String> changes = new LinkedList<>(); 754a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti String code = "class A { int a; int b; int c; }"; 764a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti CompilationUnit cu = JavaParser.parse(code); 774a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti ClassOrInterfaceDeclaration cd = cu.getClassByName("A"); 784a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti cd.getMembers().register(createObserver(changes)); 794a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti 804a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti cd.getMembers().clear(); 81c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti assertEquals(Arrays.asList("'int a;' REMOVAL in list at 0", 82c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti "'int b;' REMOVAL in list at 0", 83c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti "'int c;' REMOVAL in list at 0"), changes); 84c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti } 85c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti 86c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti @Test 87c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti public void set() { 88c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti List<String> changes = new LinkedList<>(); 89c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti String code = "class A { int a; int b; int c; }"; 90c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti CompilationUnit cu = JavaParser.parse(code); 91c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti ClassOrInterfaceDeclaration cd = cu.getClassByName("A"); 92c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti cd.getMembers().register(createObserver(changes)); 93c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti 94c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti cd.getMembers().set(1, createIntField("d")); 95c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti assertEquals(Arrays.asList("'int b;' REMOVAL in list at 1", 96c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti "'int d;' ADDITION in list at 1"), changes); 974a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti } 98ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti 99ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti @Test 100ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti public void removeNode() { 101ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti List<String> changes = new LinkedList<>(); 102ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti String code = "class A { int a; int b; int c; int d; int e; }"; 103ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti CompilationUnit cu = JavaParser.parse(code); 104ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti ClassOrInterfaceDeclaration cd = cu.getClassByName("A"); 105ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti cd.getMembers().register(createObserver(changes)); 106ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti 107ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti cd.getMembers().remove(cd.getFieldByName("c")); 108ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti assertEquals(Arrays.asList("'int c;' REMOVAL in list at 2"), changes); 109ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti } 110ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti 111ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti @Test 112ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti public void removeObject() { 113ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti List<String> changes = new LinkedList<>(); 114ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti String code = "class A { int a; int b; int c; int d; int e; }"; 115ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti CompilationUnit cu = JavaParser.parse(code); 116ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti ClassOrInterfaceDeclaration cd = cu.getClassByName("A"); 117ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti cd.getMembers().register(createObserver(changes)); 118ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti 119ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti cd.getMembers().remove("hi"); 120ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti assertEquals(Arrays.asList(), changes); 121ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti } 122ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti 123ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti @Test 124ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti public void removeAll() { 125ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti List<String> changes = new LinkedList<>(); 126ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti String code = "class A { int a; int b; int c; int d; int e; }"; 127ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti CompilationUnit cu = JavaParser.parse(code); 128ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti ClassOrInterfaceDeclaration cd = cu.getClassByName("A"); 129ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti cd.getMembers().register(createObserver(changes)); 130ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti 131ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti cd.getMembers().removeAll(Arrays.asList(cd.getFieldByName("b"), "foo", cd.getFieldByName("d"))); 132ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti assertEquals(Arrays.asList("'int b;' REMOVAL in list at 1", 133ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti "'int d;' REMOVAL in list at 2"), changes); 134ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti } 135cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti 136cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti @Test 137cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti public void retainAll() { 138cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti List<String> changes = new LinkedList<>(); 139cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti String code = "class A { int a; int b; int c; int d; int e; }"; 140cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti CompilationUnit cu = JavaParser.parse(code); 141cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti ClassOrInterfaceDeclaration cd = cu.getClassByName("A"); 142cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti cd.getMembers().register(createObserver(changes)); 143cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti 144cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti cd.getMembers().retainAll(Arrays.asList(cd.getFieldByName("b"), "foo", cd.getFieldByName("d"))); 145cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti assertEquals(Arrays.asList("'int a;' REMOVAL in list at 0", 146cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti "'int c;' REMOVAL in list at 1", 147cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti "'int e;' REMOVAL in list at 2"), changes); 148cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti } 14934ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti 15034ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti @Test 15134ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti public void replaceAll() { 15234ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti List<String> changes = new LinkedList<>(); 15334ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti String code = "class A { int a; int b; int c; }"; 15434ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti CompilationUnit cu = JavaParser.parse(code); 15534ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti ClassOrInterfaceDeclaration cd = cu.getClassByName("A"); 15634ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti cd.getMembers().register(createObserver(changes)); 15734ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti 15834ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti cd.getMembers().replaceAll(bodyDeclaration -> { 1594296abb695b767f7471dd255d0679516183b062aDanny van Bruggen FieldDeclaration clone = (FieldDeclaration) bodyDeclaration.clone(); 16024a58469927e0faee2d29a628467e998ed491449Danny van Bruggen SimpleName id = clone.getVariable(0).getName(); 16124a58469927e0faee2d29a628467e998ed491449Danny van Bruggen id.setIdentifier(id.getIdentifier().toUpperCase()); 16234ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti return clone; 16334ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti }); 16434ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti assertEquals(Arrays.asList("'int a;' REMOVAL in list at 0", "'int A;' ADDITION in list at 0", 16534ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti "'int b;' REMOVAL in list at 1", "'int B;' ADDITION in list at 1", 16634ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti "'int c;' REMOVAL in list at 2", "'int C;' ADDITION in list at 2"), changes); 16734ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti } 16855d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti 16955d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti @Test 17055d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti public void removeIf() { 17155d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti List<String> changes = new LinkedList<>(); 17255d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti String code = "class A { int a; int longName; int c; }"; 17355d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti CompilationUnit cu = JavaParser.parse(code); 17455d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti ClassOrInterfaceDeclaration cd = cu.getClassByName("A"); 17555d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti cd.getMembers().register(createObserver(changes)); 17655d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti 17724a58469927e0faee2d29a628467e998ed491449Danny van Bruggen cd.getMembers().removeIf(m -> ((FieldDeclaration) m).getVariable(0).getName().getIdentifier().length() > 3); 17855d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti assertEquals(Arrays.asList("'int longName;' REMOVAL in list at 1"), changes); 17955d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti } 1803e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti} 181