176f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti/*
276f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * Copyright (C) 2007-2010 Júlio Vilmar Gesser.
376f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * Copyright (C) 2011, 2013-2016 The JavaParser Team.
476f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti *
576f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * This file is part of JavaParser.
676f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti *
776f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * JavaParser can be used either under the terms of
876f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * a) the GNU Lesser General Public License as published by
976f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti *     the Free Software Foundation, either version 3 of the License, or
1076f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti *     (at your option) any later version.
1176f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * b) the terms of the Apache License
1276f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti *
1376f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * You should have received a copy of both licenses in LICENCE.LGPL and
1476f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * LICENCE.APACHE. Please refer to those files for details.
1576f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti *
1676f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * JavaParser is distributed in the hope that it will be useful,
1776f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * but WITHOUT ANY WARRANTY; without even the implied warranty of
1876f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1976f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * GNU Lesser General Public License for more details.
2076f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti */
2176f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti
223e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassettipackage com.github.javaparser.ast;
233e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti
243e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassettiimport com.github.javaparser.JavaParser;
253e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassettiimport com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
263e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassettiimport com.github.javaparser.ast.body.FieldDeclaration;
27f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggenimport com.github.javaparser.ast.expr.Name;
2824a58469927e0faee2d29a628467e998ed491449Danny van Bruggenimport com.github.javaparser.ast.expr.SimpleName;
290f8bbe61c2d7132846b8ad13804ae70d62c5c8bcDanny van Bruggenimport com.github.javaparser.ast.observer.AstObserver;
300f8bbe61c2d7132846b8ad13804ae70d62c5c8bcDanny van Bruggenimport com.github.javaparser.ast.observer.ObservableProperty;
313e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassettiimport com.github.javaparser.ast.type.PrimitiveType;
323e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassettiimport org.junit.Test;
333e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti
344296abb695b767f7471dd255d0679516183b062aDanny van Bruggenimport java.util.Arrays;
354296abb695b767f7471dd255d0679516183b062aDanny van Bruggenimport java.util.EnumSet;
364296abb695b767f7471dd255d0679516183b062aDanny van Bruggenimport java.util.LinkedList;
374296abb695b767f7471dd255d0679516183b062aDanny van Bruggenimport java.util.List;
383e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti
39f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggenimport static com.github.javaparser.ast.NodeList.nodeList;
403e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassettiimport static org.junit.Assert.assertEquals;
41ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthunimport static org.junit.Assert.assertFalse;
42ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthunimport static org.junit.Assert.assertTrue;
433e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti
443e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassettipublic class NodeListTest {
453e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti
463e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti    private AstObserver createObserver(List<String> changes) {
473e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti        return new AstObserver() {
483e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti            @Override
493e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti            public void propertyChange(Node observedNode, ObservableProperty property, Object oldValue, Object newValue) {
504296abb695b767f7471dd255d0679516183b062aDanny van Bruggen                changes.add(String.format("change of property %s for %s: from '%s' to '%s'", property, observedNode, oldValue, newValue));
513e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti            }
523e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti
533e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti            @Override
543e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti            public void parentChange(Node observedNode, Node previousParent, Node newParent) {
553e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti                changes.add(String.format("setting parent for %s: was %s, now is %s", observedNode, previousParent, newParent));
563e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti            }
573e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti
583e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti            @Override
593e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti            public void listChange(NodeList observedNode, ListChangeType type, int index, Node nodeAddedOrRemoved) {
60c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti                changes.add(String.format("'%s' %s in list at %d", nodeAddedOrRemoved, type, index));
613e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti            }
620d8f8e5cc0e48d0cc27cf070155ab318fe160a00Federico Tomassetti
630d8f8e5cc0e48d0cc27cf070155ab318fe160a00Federico Tomassetti            @Override
640d8f8e5cc0e48d0cc27cf070155ab318fe160a00Federico Tomassetti            public void listReplacement(NodeList observedNode, int index, Node oldNode, Node newNode) {
650d8f8e5cc0e48d0cc27cf070155ab318fe160a00Federico Tomassetti                changes.add(String.format("'%s' %s in list at %d", oldNode, ListChangeType.REMOVAL, index));
660d8f8e5cc0e48d0cc27cf070155ab318fe160a00Federico Tomassetti                changes.add(String.format("'%s' %s in list at %d", newNode, ListChangeType.ADDITION, index));
670d8f8e5cc0e48d0cc27cf070155ab318fe160a00Federico Tomassetti            }
683e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti        };
693e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti    }
703e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti
713e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti    private FieldDeclaration createIntField(String name) {
7215c2aa05f936720e8f7efdedbbc68450a6f27fb3Danny van Bruggen        return new FieldDeclaration(EnumSet.noneOf(Modifier.class), PrimitiveType.intType(), name);
733e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti    }
743e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti
753e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti    @Test
763e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti    public void addAllWithoutIndex() {
773e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti        List<String> changes = new LinkedList<>();
783e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti        String code = "class A { void foo(int p) { }}";
793e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti        CompilationUnit cu = JavaParser.parse(code);
801ff8db9b9d9fdd6c9655d9d37761a00e98ab6d04Danny van Bruggen        ClassOrInterfaceDeclaration cd = cu.getClassByName("A").get();
813e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti        cd.getMembers().register(createObserver(changes));
823e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti
833e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti        cd.getMembers().addAll(Arrays.asList(createIntField("a"), createIntField("b"), createIntField("c")));
84c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti        assertEquals(Arrays.asList("'int a;' ADDITION in list at 1",
85c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti                "'int b;' ADDITION in list at 2",
86c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti                "'int c;' ADDITION in list at 3"), changes);
873e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti    }
88150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti
89150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti    @Test
90150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti    public void addAllWithIndex() {
91150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti        List<String> changes = new LinkedList<>();
92150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti        String code = "class A { void foo(int p) { }}";
93150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti        CompilationUnit cu = JavaParser.parse(code);
941ff8db9b9d9fdd6c9655d9d37761a00e98ab6d04Danny van Bruggen        ClassOrInterfaceDeclaration cd = cu.getClassByName("A").get();
95150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti        cd.getMembers().register(createObserver(changes));
96150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti
97150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti        cd.getMembers().addAll(0, Arrays.asList(createIntField("a"), createIntField("b"), createIntField("c")));
98c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti        assertEquals(Arrays.asList("'int a;' ADDITION in list at 0",
99c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti                "'int b;' ADDITION in list at 1",
100c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti                "'int c;' ADDITION in list at 2"), changes);
101150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti    }
1024a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti
1034a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti    @Test
1044a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti    public void clear() {
1054a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti        List<String> changes = new LinkedList<>();
1064a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti        String code = "class A { int a; int b; int c; }";
1074a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti        CompilationUnit cu = JavaParser.parse(code);
1081ff8db9b9d9fdd6c9655d9d37761a00e98ab6d04Danny van Bruggen        ClassOrInterfaceDeclaration cd = cu.getClassByName("A").get();
1094a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti        cd.getMembers().register(createObserver(changes));
1104a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti
1114a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti        cd.getMembers().clear();
112c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti        assertEquals(Arrays.asList("'int a;' REMOVAL in list at 0",
113c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti                "'int b;' REMOVAL in list at 0",
114c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti                "'int c;' REMOVAL in list at 0"), changes);
115c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti    }
116c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti
117c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti    @Test
118c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti    public void set() {
119c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti        List<String> changes = new LinkedList<>();
120c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti        String code = "class A { int a; int b; int c; }";
121c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti        CompilationUnit cu = JavaParser.parse(code);
1221ff8db9b9d9fdd6c9655d9d37761a00e98ab6d04Danny van Bruggen        ClassOrInterfaceDeclaration cd = cu.getClassByName("A").get();
123c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti        cd.getMembers().register(createObserver(changes));
124c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti
125c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti        cd.getMembers().set(1, createIntField("d"));
126c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti        assertEquals(Arrays.asList("'int b;' REMOVAL in list at 1",
127c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti                "'int d;' ADDITION in list at 1"), changes);
1284a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti    }
129ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti
130ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti    @Test
131ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti    public void removeNode() {
132ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti        List<String> changes = new LinkedList<>();
133ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti        String code = "class A { int a; int b; int c; int d; int e; }";
134ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti        CompilationUnit cu = JavaParser.parse(code);
1351ff8db9b9d9fdd6c9655d9d37761a00e98ab6d04Danny van Bruggen        ClassOrInterfaceDeclaration cd = cu.getClassByName("A").get();
136ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti        cd.getMembers().register(createObserver(changes));
137ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti
1381ff8db9b9d9fdd6c9655d9d37761a00e98ab6d04Danny van Bruggen        cd.getMembers().remove(cd.getFieldByName("c").get());
139ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti        assertEquals(Arrays.asList("'int c;' REMOVAL in list at 2"), changes);
140ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti    }
141ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti
142ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti    @Test
143ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun    public void removeFirstNode() {
144ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun        List<String> changes = new LinkedList<>();
145ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun        String code = "class A { int a; int b; int c; int d; int e; }";
146ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun        CompilationUnit cu = JavaParser.parse(code);
147ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun        ClassOrInterfaceDeclaration cd = cu.getClassByName("A").get();
148ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun        cd.getMembers().register(createObserver(changes));
149ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun
150ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun        cd.getMembers().removeFirst();
151ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun        assertEquals(Arrays.asList("'int a;' REMOVAL in list at 0"), changes);
152ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun        assertEquals(cd.getMembers().size(), 4);
153ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun
154ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun        for (int i = 3; i >= 0; i--) {
155e217cb36a3454afa75a14896f5cd85fb1c0d83f6stephenramthun            assertTrue(cd.getMembers().removeFirst() != null);
156ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun            assertEquals(cd.getMembers().size(), i);
157ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun        }
158ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun
159ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun        assertEquals(cd.getMembers().size(), 0);
160ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun    }
161ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun
162ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun    @Test
163ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun    public void removeLastNode() {
164ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun        List<String> changes = new LinkedList<>();
165ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun        String code = "class A { int a; int b; int c; int d; int e; }";
166ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun        CompilationUnit cu = JavaParser.parse(code);
167ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun        ClassOrInterfaceDeclaration cd = cu.getClassByName("A").get();
168ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun        cd.getMembers().register(createObserver(changes));
169ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun
170ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun        cd.getMembers().removeLast();
171ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun        assertEquals(Arrays.asList("'int e;' REMOVAL in list at 4"), changes);
172ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun        assertEquals(cd.getMembers().size(), 4);
173ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun
174ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun        for (int i = 3; i >= 0; i--) {
175e217cb36a3454afa75a14896f5cd85fb1c0d83f6stephenramthun            assertTrue(cd.getMembers().removeLast() != null);
176ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun            assertEquals(cd.getMembers().size(), i);
177ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun        }
178ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun
179ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun        assertEquals(cd.getMembers().size(), 0);
180ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun    }
181ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun
182ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun    @Test
183ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti    public void removeObject() {
184ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti        List<String> changes = new LinkedList<>();
185ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti        String code = "class A { int a; int b; int c; int d; int e; }";
186ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti        CompilationUnit cu = JavaParser.parse(code);
1871ff8db9b9d9fdd6c9655d9d37761a00e98ab6d04Danny van Bruggen        ClassOrInterfaceDeclaration cd = cu.getClassByName("A").get();
188ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti        cd.getMembers().register(createObserver(changes));
189ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti
190ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti        cd.getMembers().remove("hi");
191ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti        assertEquals(Arrays.asList(), changes);
192ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti    }
193ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti
194ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti    @Test
195ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti    public void removeAll() {
196ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti        List<String> changes = new LinkedList<>();
197ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti        String code = "class A { int a; int b; int c; int d; int e; }";
198ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti        CompilationUnit cu = JavaParser.parse(code);
1991ff8db9b9d9fdd6c9655d9d37761a00e98ab6d04Danny van Bruggen        ClassOrInterfaceDeclaration cd = cu.getClassByName("A").get();
200ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti        cd.getMembers().register(createObserver(changes));
201ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti
2021ff8db9b9d9fdd6c9655d9d37761a00e98ab6d04Danny van Bruggen        cd.getMembers().removeAll(Arrays.asList(cd.getFieldByName("b").get(), "foo", cd.getFieldByName("d").get()));
203ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti        assertEquals(Arrays.asList("'int b;' REMOVAL in list at 1",
204ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti                "'int d;' REMOVAL in list at 2"), changes);
205ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti    }
206cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti
207cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti    @Test
208cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti    public void retainAll() {
209cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti        List<String> changes = new LinkedList<>();
210cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti        String code = "class A { int a; int b; int c; int d; int e; }";
211cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti        CompilationUnit cu = JavaParser.parse(code);
2121ff8db9b9d9fdd6c9655d9d37761a00e98ab6d04Danny van Bruggen        ClassOrInterfaceDeclaration cd = cu.getClassByName("A").get();
213cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti        cd.getMembers().register(createObserver(changes));
214cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti
2151ff8db9b9d9fdd6c9655d9d37761a00e98ab6d04Danny van Bruggen        cd.getMembers().retainAll(Arrays.asList(cd.getFieldByName("b").get(), "foo", cd.getFieldByName("d").get()));
216cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti        assertEquals(Arrays.asList("'int a;' REMOVAL in list at 0",
217cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti                "'int c;' REMOVAL in list at 1",
218cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti                "'int e;' REMOVAL in list at 2"), changes);
219cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti    }
22034ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti
22134ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti    @Test
22234ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti    public void replaceAll() {
22334ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti        List<String> changes = new LinkedList<>();
22434ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti        String code = "class A { int a; int b; int c; }";
22534ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti        CompilationUnit cu = JavaParser.parse(code);
2261ff8db9b9d9fdd6c9655d9d37761a00e98ab6d04Danny van Bruggen        ClassOrInterfaceDeclaration cd = cu.getClassByName("A").get();
22734ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti        cd.getMembers().register(createObserver(changes));
22834ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti
22934ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti        cd.getMembers().replaceAll(bodyDeclaration -> {
2304296abb695b767f7471dd255d0679516183b062aDanny van Bruggen            FieldDeclaration clone = (FieldDeclaration) bodyDeclaration.clone();
23124a58469927e0faee2d29a628467e998ed491449Danny van Bruggen            SimpleName id = clone.getVariable(0).getName();
23224a58469927e0faee2d29a628467e998ed491449Danny van Bruggen            id.setIdentifier(id.getIdentifier().toUpperCase());
23334ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti            return clone;
23434ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti        });
23534ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti        assertEquals(Arrays.asList("'int a;' REMOVAL in list at 0", "'int A;' ADDITION in list at 0",
23634ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti                "'int b;' REMOVAL in list at 1", "'int B;' ADDITION in list at 1",
23734ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti                "'int c;' REMOVAL in list at 2", "'int C;' ADDITION in list at 2"), changes);
23834ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti    }
23955d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti
24055d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti    @Test
24155d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti    public void removeIf() {
24255d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti        List<String> changes = new LinkedList<>();
24355d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti        String code = "class A { int a; int longName; int c; }";
24455d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti        CompilationUnit cu = JavaParser.parse(code);
2451ff8db9b9d9fdd6c9655d9d37761a00e98ab6d04Danny van Bruggen        ClassOrInterfaceDeclaration cd = cu.getClassByName("A").get();
24655d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti        cd.getMembers().register(createObserver(changes));
24755d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti
24824a58469927e0faee2d29a628467e998ed491449Danny van Bruggen        cd.getMembers().removeIf(m -> ((FieldDeclaration) m).getVariable(0).getName().getIdentifier().length() > 3);
24955d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti        assertEquals(Arrays.asList("'int longName;' REMOVAL in list at 1"), changes);
25055d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti    }
251f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen
252f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen    @Test
253f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen    public void replace() {
254f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen        final NodeList<Name> list = nodeList(new Name("a"), new Name("b"), new Name("c"));
255f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen
256f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen        final boolean replaced = list.replace(new Name("b"), new Name("z"));
257f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen
258f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen        assertEquals(true, replaced);
259f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen        assertEquals(3, list.size());
260f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen        assertEquals("a", list.get(0).asString());
261f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen        assertEquals("z", list.get(1).asString());
262f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen        assertEquals("c", list.get(2).asString());
263f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen    }
2643b31ef89fd3f2963c2bf53655f42ed459376e879Danny van Bruggen
2653b31ef89fd3f2963c2bf53655f42ed459376e879Danny van Bruggen    @Test
2663b31ef89fd3f2963c2bf53655f42ed459376e879Danny van Bruggen    public void toStringTest() {
2673b31ef89fd3f2963c2bf53655f42ed459376e879Danny van Bruggen        final NodeList<Name> list = nodeList(new Name("abc"), new Name("bcd"), new Name("cde"));
2683b31ef89fd3f2963c2bf53655f42ed459376e879Danny van Bruggen
269716c3b490fe90c09b9ca66d66569eb58f52e8b48Danny van Bruggen        assertEquals("[abc, bcd, cde]", list.toString());
2703b31ef89fd3f2963c2bf53655f42ed459376e879Danny van Bruggen    }
271ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun
27233115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen    @Test
273dd34bf7240d5269586b601e76a8735629d90d5aaDanny van Bruggen    public void addFirst() {
27433115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen        final NodeList<Name> list = nodeList(new Name("abc"), new Name("bcd"), new Name("cde"));
27533115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen
276dd34bf7240d5269586b601e76a8735629d90d5aaDanny van Bruggen        list.addFirst(new Name("xxx"));
277ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun
27833115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen        assertEquals("[xxx, abc, bcd, cde]", list.toString());
27933115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen    }
280ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun
28133115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen    @Test
282dd34bf7240d5269586b601e76a8735629d90d5aaDanny van Bruggen    public void addLast() {
28333115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen        final NodeList<Name> list = nodeList(new Name("abc"), new Name("bcd"), new Name("cde"));
28433115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen
285dd34bf7240d5269586b601e76a8735629d90d5aaDanny van Bruggen        list.addLast(new Name("xxx"));
286ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun
28733115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen        assertEquals("[abc, bcd, cde, xxx]", list.toString());
28833115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen    }
28933115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen
29033115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen    @Test
29133115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen    public void addBefore() {
29233115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen        Name n = new Name("bcd");
29333115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen        final NodeList<Name> list = nodeList(new Name("abc"), n, new Name("cde"));
29433115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen
29533115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen        list.addBefore(new Name("xxx"), n);
296ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun
29733115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen        assertEquals("[abc, xxx, bcd, cde]", list.toString());
29833115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen    }
29933115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen
30033115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen    @Test
30133115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen    public void addAfter() {
30233115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen        Name n = new Name("bcd");
30333115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen        final NodeList<Name> list = nodeList(new Name("abc"), n, new Name("cde"));
30433115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen
30533115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen        list.addAfter(new Name("xxx"), n);
306ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun
30733115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen        assertEquals("[abc, bcd, xxx, cde]", list.toString());
30833115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen    }
30933115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen
31033115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen    @Test
31133115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen    public void addBeforeFirst() {
31233115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen        Name abc = new Name("abc");
31333115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen        final NodeList<Name> list = nodeList(abc, new Name("bcd"), new Name("cde"));
31433115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen
31533115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen        list.addBefore(new Name("xxx"), abc);
316ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun
31733115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen        assertEquals("[xxx, abc, bcd, cde]", list.toString());
31833115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen    }
31933115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen
32033115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen    @Test
32133115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen    public void addAfterLast() {
32233115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen        Name cde = new Name("cde");
32333115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen        final NodeList<Name> list = nodeList(new Name("abc"), new Name("bcd"), cde);
32433115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen
32533115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen        list.addAfter(new Name("xxx"), cde);
326ae442842668f9414f3a5fd8a294968d7cddf147fstephenramthun
32733115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen        assertEquals("[abc, bcd, cde, xxx]", list.toString());
32833115b3c857a87e398e9eaffd3d29c47804a0a53Danny van Bruggen    }
3293e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti}
330