Skip to content

Commit 021a702

Browse files
committedDec 9, 2022
Add the Junit_Less_8
1 parent a1693a1 commit 021a702

File tree

5 files changed

+281
-0
lines changed

5 files changed

+281
-0
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package GenericClasses;
2+
3+
import MyCuteCats.Cat;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
// Класс зоопарк параметризирован <T типом наследником Cat>
8+
public class Zoo <T extends Cat> {
9+
// List параметризирован тем же типом T
10+
private List<T> cats;
11+
public Zoo() {
12+
cats = new ArrayList<>();
13+
}
14+
public float getWeightOfAllCatsInZoo() {
15+
float result = 0;
16+
for (T cat : cats) {
17+
result += cat.getWeight();
18+
}
19+
return result;
20+
}
21+
22+
public void add(T cat) {
23+
cats.add(cat);
24+
}
25+
/*
26+
А вот тут интересный момент, если сам класс Zoo параметризирован <T типом наследником Cat>,
27+
то в данном случае используется конструкция <?> 'дикие карты' - wildcard (джокер, неожиданный),
28+
т.е. в данной ситуации совершенно любой тип и необязательно <T> и его наследники. Подробные уроки
29+
см. https://github.com/JcoderPaul/JavaExtended-1-6/tree/master/Less_6_OOP_GenericsWildCard
30+
*/
31+
public int compare(Zoo<?> another) {
32+
return Float.compare(getWeightOfAllCatsInZoo(), another.getWeightOfAllCatsInZoo());
33+
}
34+
/*
35+
Данный метод параметризирован <U наследником Cat>, а вот его аргументы параметризированы
36+
двумя разновидностями wildcard:
37+
- <? extends U> - любой тип наследник U;
38+
- <? super U> - любой тип родитель U;
39+
40+
Если мы укажем Zoo<Integer> source - то тут явно указан тип Integer, и данный класс может
41+
работать только с Integer, если укажем Zoo<Number> source, то класс может работать только
42+
с Number, хотя Integer наследник Number. Но если мы укажем Zoo<? extends Number>, то класс
43+
сможет использовать в работе всех наследников Number. Если же применить конструкцию
44+
Zoo<? super Number>, то всех родителей Number.
45+
!!! И естественно родитель не обязан знать о структуре наследника, в то время как наследник
46+
точно знает о содержимом родителя !!!
47+
Отсюда вытекает особенность передачи данных в <параметризированных типах> от источника к приемнику,
48+
в разрезе коллекций это просматривается явно, наследник может стать источником и отдавать данные,
49+
родитель может принимать данные от наследников.
50+
*/
51+
public static <U extends Cat> void transfer(Zoo<? extends U> source, Zoo<? super U> destination) {
52+
/*
53+
Вызываем метод *.addAll() - 'добавить все',
54+
у коллекции <родителя U>, в параметрах
55+
передаем коллекцию <наследника U>
56+
*/
57+
destination.cats.addAll(source.cats);
58+
/*
59+
Очистили коллекцию источник
60+
*/
61+
source.cats.clear();
62+
}
63+
64+
public List<T> getCats() {
65+
return cats;
66+
}
67+
68+
public int getSizeOfCatsZoo() {
69+
return cats.size();
70+
}
71+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package MyCuteCats;
2+
3+
public abstract class Cat {
4+
public abstract float getWeight();
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package MyCuteCats;
2+
3+
import java.util.Random;
4+
5+
public class Serval extends Cat{
6+
private float servalWeight;
7+
public Serval() {
8+
Random rnd = new Random();
9+
servalWeight = (float)(rnd.nextInt(9)) + 3.5f;
10+
}
11+
@Override
12+
public float getWeight() {
13+
14+
return servalWeight;
15+
}
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package MyCuteCats;
2+
3+
import java.util.Random;
4+
5+
public class Tiger extends Cat{
6+
private float tigerWeight;
7+
8+
public Tiger() {
9+
Random rnd = new Random();
10+
tigerWeight = (float)(rnd.nextInt(210)) + 110.5f;
11+
}
12+
@Override
13+
public float getWeight() {
14+
return tigerWeight;
15+
}
16+
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
package GenericClasses;
2+
/*
3+
!!! Понимание это приходит не сразу !!!
4+
Любой метод, что обычный, что тестовый
5+
должны быть максимально сжатыми (короткими).
6+
7+
Можно ошибиться в основном коде и чем метод
8+
длиннее, тем сложнее искать ошибку, есть
9+
возможность разбить метод на подметоды,
10+
лучше это сделать.
11+
12+
С тестами этот принцип просматривается
13+
'на раз', т.к. чем длиннее тест, тем
14+
выше вероятность еще и в нем совершить
15+
ошибку... (ошибка в коде, ошибка в тесте)
16+
17+
Чем короче метод:
18+
-> тем понятнее, что в нем происходит;
19+
-> тем проще, отлавливать ошибки и править код;
20+
*/
21+
22+
import MyCuteCats.Cat;
23+
import MyCuteCats.Serval;
24+
import MyCuteCats.Tiger;
25+
import org.junit.Before;
26+
import org.junit.Test;
27+
28+
import static org.junit.Assert.assertEquals;
29+
30+
public class ZooTest {
31+
32+
Zoo<Cat> catZoo;
33+
Zoo<Tiger> tigerZoo;
34+
Zoo<Serval> servalZoo;
35+
36+
@Before
37+
public void setUp() throws Exception {
38+
catZoo = new Zoo<>();
39+
tigerZoo = new Zoo<>();
40+
servalZoo = new Zoo<>();
41+
for (int i = 0; i < 10; i++) {
42+
servalZoo.add(new Serval());
43+
tigerZoo.add(new Tiger());
44+
}
45+
}
46+
47+
@Test
48+
public void getWeightOfAllCatsInZoo() {
49+
System.out.println("------- Тест getWeightOfAllCatsInZoo() -------");
50+
float foolAsserWeightServalInZoo = 0;
51+
for (int i = 0; i < servalZoo.getCats().size(); i++){
52+
foolAsserWeightServalInZoo += servalZoo.getCats().get(i).getWeight();
53+
}
54+
System.out.println("Вес всех сервалов в Зоопарке: " + foolAsserWeightServalInZoo);
55+
/*
56+
!!! Применение метода *.assertEquals() с Float требует
57+
указания точности 'delta' - в нашем случае мы установили 0.001 !!!
58+
*/
59+
assertEquals(foolAsserWeightServalInZoo, servalZoo.getWeightOfAllCatsInZoo(), 0.001);
60+
61+
float foolAsserWeightTigerInZoo = 0;
62+
for (int i = 0; i < tigerZoo.getCats().size(); i++){
63+
foolAsserWeightTigerInZoo += tigerZoo.getCats().get(i).getWeight();
64+
}
65+
System.out.println("Вес всех тигров в Зоопарке: " + foolAsserWeightTigerInZoo);
66+
/*
67+
ЕЩЕ РАЗ НА ЗАМЕТКУ
68+
!!! Применение метода *.assertEquals() с Float требует
69+
указания точности 'delta' - в нашем случае мы установили 0.001 !!!
70+
*/
71+
assertEquals(foolAsserWeightTigerInZoo, tigerZoo.getWeightOfAllCatsInZoo(), 0.001);
72+
}
73+
74+
@Test
75+
public void add_IfAddingElementToArrayIncreasesItsSize() {
76+
System.out.println("------- Тест add_IfAddingElementToArrayIncreasesItsSize() -------");
77+
assertEquals(10, tigerZoo.getSizeOfCatsZoo());
78+
assertEquals(10, servalZoo.getSizeOfCatsZoo());
79+
tigerZoo.add(new Tiger());
80+
servalZoo.add(new Serval());
81+
assertEquals(11, tigerZoo.getSizeOfCatsZoo());
82+
assertEquals(11, servalZoo.getSizeOfCatsZoo());
83+
}
84+
85+
@Test
86+
public void compare() {
87+
System.out.println("------- Тест compare() -------");
88+
/*
89+
Метод сравнение в нашем случае работает с весами
90+
котиков, причем с суммой всех весов в коллекции.
91+
Как и любое сравнение мы оперируем условно тремя
92+
значениями:
93+
'1' - если то, что сравнивают (объект на котором
94+
метод вызван), больше того с чем сравнивают
95+
(объект переданный в аргументе метода);
96+
'0' - объекты равны;
97+
'-1' - если то, что сравнивают (объект на котором
98+
метод вызван), меньше того с чем сравнивают
99+
(объект переданный в аргументе метода);
100+
101+
Естественно в нашем случае тигры по определению тяжелее
102+
сервалов и на оборот. Ну и сравнение объекта самого с
103+
собой дает однозначный результат.
104+
*/
105+
assertEquals(1, tigerZoo.compare(servalZoo));
106+
assertEquals(-1, servalZoo.compare(tigerZoo));
107+
assertEquals(0, tigerZoo.compare(tigerZoo));
108+
assertEquals(0, servalZoo.compare(servalZoo));
109+
}
110+
111+
@Test
112+
public void transfer_TransferAllObjectsCatTypeToOneZoo() {
113+
System.out.println("------- Тест transfer_TransferAllObjectsCatTypeToOneZoo() -------");
114+
float foolAsserWeightInBothZoo = 0;
115+
for (int i = 0; i < servalZoo.getCats().size(); i++){
116+
foolAsserWeightInBothZoo += servalZoo.getCats().get(i).getWeight();
117+
}
118+
System.out.println("Вес всех сервалов: " + foolAsserWeightInBothZoo);
119+
for (int i = 0; i < tigerZoo.getCats().size(); i++){
120+
foolAsserWeightInBothZoo += tigerZoo.getCats().get(i).getWeight();
121+
}
122+
System.out.println("Вес всех сервалов и тигров вместе: " + foolAsserWeightInBothZoo);
123+
124+
Zoo.transfer(servalZoo, catZoo);
125+
Zoo.transfer(tigerZoo, catZoo);
126+
assertEquals(foolAsserWeightInBothZoo, catZoo.getWeightOfAllCatsInZoo(), 0.001);
127+
assertEquals(0f, servalZoo.getWeightOfAllCatsInZoo(), 0.001);
128+
assertEquals(0f, tigerZoo.getWeightOfAllCatsInZoo(), 0.001);
129+
}
130+
131+
@Test
132+
public void transfer_TransferAllTigerAndServalTypeObjectsToZoosOfOnlyTheirTypes() {
133+
System.out.println("------- Тест transfer_TransferAllTigerAndServalTypeObjectsToZoosOfOnlyTheirTypes() -------");
134+
float foolAsserWeightInFirstServalZoo = 0;
135+
for (int i = 0; i < servalZoo.getCats().size(); i++){
136+
foolAsserWeightInFirstServalZoo += servalZoo.getCats().get(i).getWeight();
137+
}
138+
System.out.println("Вес всех сервалов в первом зоопарке: " + foolAsserWeightInFirstServalZoo);
139+
140+
float foolAsserWeightInFirstTigerZoo = 0;
141+
for (int i = 0; i < tigerZoo.getCats().size(); i++){
142+
foolAsserWeightInFirstTigerZoo += tigerZoo.getCats().get(i).getWeight();
143+
}
144+
System.out.println("Вес всех тигров в первом зоопарке: " + foolAsserWeightInFirstTigerZoo);
145+
146+
/* Создадим два дополнительных однотипных зоопарка */
147+
Zoo<Serval> servalZooTwo = new Zoo<>();
148+
Zoo<Tiger> tigerZooTwo = new Zoo<>();
149+
float foolAsserWeightInSecondServalZoo = 0;
150+
float foolAsserWeightInSecondTigerZoo = 0;
151+
for (int i = 0; i < 10; i++) {
152+
Serval serval = new Serval();
153+
foolAsserWeightInSecondServalZoo += serval.getWeight();
154+
servalZooTwo.add(serval);
155+
Tiger tiger = new Tiger();
156+
foolAsserWeightInSecondTigerZoo += tiger.getWeight();
157+
tigerZooTwo.add(tiger);
158+
}
159+
System.out.println("Вес всех сервалов во втором зоопарке: " + foolAsserWeightInSecondServalZoo);
160+
System.out.println("Вес всех тигров во втором зоопарке: " + foolAsserWeightInSecondTigerZoo);
161+
Zoo.transfer(servalZooTwo, servalZoo);
162+
Zoo.transfer(tigerZooTwo, tigerZoo);
163+
float foolAsserWeightInBothServalZoo = foolAsserWeightInFirstServalZoo +
164+
foolAsserWeightInSecondServalZoo;
165+
float foolAsserWeightInBothTigerZoo = foolAsserWeightInFirstTigerZoo +
166+
foolAsserWeightInSecondTigerZoo;
167+
assertEquals(foolAsserWeightInBothServalZoo, servalZoo.getWeightOfAllCatsInZoo(), 0.001);
168+
assertEquals(foolAsserWeightInBothTigerZoo, tigerZoo.getWeightOfAllCatsInZoo(), 0.001);
169+
assertEquals(0f, servalZooTwo.getWeightOfAllCatsInZoo(), 0.001);
170+
assertEquals(0f, tigerZooTwo.getWeightOfAllCatsInZoo(), 0.001);
171+
}
172+
}

0 commit comments

Comments
 (0)