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