Метод удаляет элемент по индексу
List modelList;
// Метод добавляет элемент e в список. void add(Integer e);
// Метод удаляет элемент по индексу index из списка. // Если индекс выходит за границы списка, // вырабатывается исключение IndexOutOfBoundsException. void remove(int index) throws IndexOutOfBoundsException;
Тестовые ситуации для метода add:
- список пуст;
- список не пуст.
Тестовые ситуации для метода remove:
- индекс index отсутствует в списке;
- индекс index есть в списке:
- список пуст;
- список содержит единственный элемент;
- список содержит больше одного элемента.
Обобщенное состояние - IntGenState, параметр конструктора - длина списка modelList: modelList.size(). Для ограничения количества состояний в сценарий добавляется переменная int maxSize. Для метода add с использованием конструкции iterate итерируются элементы списка - целые числа; итерация происходит, только если длина списка не превышает maxSize. Для метода remove итерируются индексы списка:
scenario boolean add() { //objectUnderTest - модель, содержащая спецификационные методы //add и remove
if(objectUnderTest.modelList.size()<maxSize) { iterate(int i=0; i<10; i++; ) { //вызов спецификационного метода add
objectUnderTest.add(new Integer(i)); } } return true; }
scenario boolean remove() { iterate(int i=-1; i<=objectUnderTest.modelList.size(); i++; ) { //вызов спецификационного метода remove
objectUnderTest.remove(i); } return true; }
Set modelSet;
// Метод добавляет элемент e в множество. void add(Integer e);
// Метод удаляет элемент e из множества. // Если элемент присутствовал во множестве, возвращает true, иначе false. boolean remove(Integer e);
Тестовые ситуации для метода add:
- множество пусто;
- множество не пусто:
- добавляемый элемент присутствует в множестве;
- добавляемый элемент отсутствует в множестве.
Тестовые ситуации для метода remove:
- множество пусто;
- множество содержит единственный элемент:
- удаляемый элемент присутствует во множестве;
- удаляемый элемент отсутствует во множестве;
- множество содержит более одного элемента:
- удаляемый элемент присутствует во множестве;
- удаляемый элемент отсутствует во множестве.
Обобщенное состояние - IntGenState, параметр конструктора - размер множества modelSet: modelSet.size(). Для ограничения количества состояний в сценарий добавляется переменная int maxSize. Для методов add и remove итерируются ветви функциональности, соответствующие отсутствию или присутствию элемента во множестве. Для каждой ветви перебираются элементы множества до тех пор, пока не будет найден элемент, попадающий в выбранную ветвь функциональности. Для ограничения количества обобщенных состояний итерация для метода add происходит, только если размер множества не превышает maxSize.
scenario boolean add() { //objectUnderTest - модель, содержащая спецификационные методы //add и remove
if(objectUnderTest.modelSet.size()<maxSize) { // 0 - элемент отсутствует во множестве // 1 - элемент присутствует во множестве iterate(int b=0; b<2; b++; ) { //поиск элемента, удовлетворяющего заданной ветви for(int i=0; i<10; i++) { Integer e = new Integer(i); if(b==0 && !objectUnderTest.modelSet.contains(e) b==1 && objectUnderTest.modelSet.contains(e)) { //вызов спецификационного метода add
objectUnderTest.add(e); break; } } } } return true; }
scenario boolean remove() { iterate(int b=0; b<2; b++; ) { //поиск элемента, удовлетворяющего заданной ветви for(int i=0; i<10; i++) { Integer e = new Integer(i); if(b==0 && !objectUnderTest.modelSet.contains(e)) { b==1 && objectUnderTest.modelSet.contains(e)) { //вызов спецификационного метода remove
objectUnderTest.remove(e); break; } } } return true; }
Пример 1. Произведение длин списков.
Спецификация описывает список, такой же, как в примере для паттерна Длина списка.
List modelList;
// Метод добавляет элемент e в список. void add(Integer e);
// Метод удаляет элемент по индексу index из списка. // Если индекс выходит за границы списка, // вырабатывается исключение IndexOutOfBoundsException. void remove(int index) throws IndexOutOfBoundsException;
В сценарии заводится массив ListMediator testLists[], в котором хранятся списки, сконструированные для тестирования. Т.е. в этом массиве хранятся те же объекты, что используются для тестирования одного списка (objectUnderTest), - медиаторы списков с присоединенными оракулами. Обобщенное состояние - IntListGenState. При конструировании обобщенного состояния производится итерация по элементам массива testList и добавляется длина каждого списка modelList: modelList.size(). Так же, как и для тестирования одного списка, вводится ограничение на максимальную длину всех списков int maxSize. Для тестирования методов добавления и удаления в сценарных методах итерируются тестируемые списки, а затем параметры методов, так же, как для одного списка.
scenario boolean add() { iterate(int i=0; i<=objectUnderTest.testLists.length; i++; ) { objectUnderTest = testLists[i]; //objectUnderTest - модель, содержащая спецификационные методы //add и remove
if(objectUnderTest.modelList.size()<maxSize) { iterate(int j=0; j<10; i++; ) { //вызов спецификационного метода add
objectUnderTest.add(new Integer(j)); } } } return true; }
scenario boolean remove() { iterate(int i=0; i<=objectUnderTest.testLists.length; i++; ) { objectUnderTest = testLists[i]; iterate(int j=-1; j<=objectUnderTest.modelList.size(); j++; ) { //вызов спецификационного метода remove objectUnderTest.remove(j); } } return true; }
Пример 2. Активные идентификаторы.
// Отображение из идентификаторов объектов в статус объекта. // true - объект активный, false - объект неактивный Map modelMap;
// Метод связывает ключ key со значением value. // Если ключ присутствовал в отображении, // возвращает предыдущее значение, связанное ключом, // иначе возвращает null.
Tree modelTree;
// Метод добавляет вершину node к вершине parent, // если parent есть в дереве. // Если вершины parent нет в дереве, вершина не добавляется. add(Node parent, Node node);
// Метод удаляет вершину node, если таковая есть в дереве // и является листовой. // Иначе вершина не удаляется. delete(Node node);
// Метод создает корневую вершину; вершину можно создать, // если дерево пусто. Node createRoot();
Тестовые ситуации для метода add:
- родитель не существует;
- родитель существует:
- родитель не имеет дочерних вершин;
- родитель имеет дочерние вершины.
Тестовые ситуации для метода delete:
- вершина не существует;
- вершина существует:
- вершина не имеет дочерних вершин;
- вершина имеет дочерние вершины.
Тестовые ситуации для метода createRoot:
- дерево пусто;
- дерево не пусто.
Обобщенное состояние - мультимножество целых чисел IntMultisetGenState. Считаем, что имеется метод, возвращающий вершину дерева по номеру от нуля до числа вершин в дереве modelTree.getNodeByIndex(int index) .
IntMultisetGenState genstate = new IntMultisetGenState(); for(int i=0; i<objectUnderTest.modelTree.size(); i++) { Node node = objectUnderTest.modelTree.getNodeByIndex(i); genstate.addElement(node.children().size()); }
Для ограничения количества состояний в сценарий добавляется переменная int maxSize. Для метода add итерируем элементы мультимножества, и для каждого элемента подбираем вершину с соответствующим количеством детей. Считаем, что имеется функция, которая возвращает вершину с указанным количеством детей getNodeWithChildrenSize(int size) ; если таких вершин несколько, возвращается произвольная. Итерация происходит, если количество вершин не превышает maxSize.
scenario boolean add() { //objectUnderTest - модель, содержащая спецификационные методы //add и delete if(objectUnderTest.modelTree.size()<maxSize) { IntMultisetGenState ms = getGenState(); //итерация элементов мультимножества iterate(IntegerIteratorInterface iter = ms.getIterator(); !iter.stopIteration(); iter.next(); ) { //подбор соответствующей вершины Node parent = objectUnderTest.modelTree.getNodeWithChildrenSize(iter.value()); //итерация добавляемых вершин iterate(int j=0; j<10; j++) { Node node = new Node(j); //вызов спецификационного метода add
objectUnderTest.add(parent, node); } } } return true; }
Для метода delete итерируются номера вершин дерева, а также вводится дополнительный сценарный метод, гарантированно удаляющий вершину.
Содержание раздела