main.cpp
1 /* ************************************************************************** */ 2 /* */ 3 /* ::: :::::::: */ 4 /* main.cpp :+: :+: :+: */ 5 /* +:+ +:+ +:+ */ 6 /* By: gychoi <gychoi@student.42seoul.kr> +#+ +:+ +#+ */ 7 /* +#+#+#+#+#+ +#+ */ 8 /* Created: 2023/08/15 17:12:29 by gychoi #+# #+# */ 9 /* Updated: 2023/08/17 21:24:43 by gychoi ### ########.fr */ 10 /* */ 11 /* ************************************************************************** */ 12 13 #include "Animal.hpp" 14 #include "Cat.hpp" 15 #include "Dog.hpp" 16 #include "WrongAnimal.hpp" 17 #include "WrongCat.hpp" 18 #include <iostream> 19 20 #ifdef LEAKS_CHECK 21 # include <cstdlib> 22 void check_leaks(void) 23 { 24 system("leaks a.out"); 25 } 26 # define ATEXIT_CHECK() atexit(check_leaks) 27 #else 28 # define ATEXIT_CHECK() 29 #endif 30 31 void makeTestName(std::string const& str) 32 { 33 std::cout << "\n--------------------" << std::endl; 34 std::cout << str << std::endl; 35 std::cout << "--------------------\n" << std::endl; 36 } 37 38 void subjectTest(void) 39 { 40 const Animal* j = new Dog(); 41 const Animal* i = new Cat(); 42 43 delete j; 44 delete i; 45 } 46 47 void testOne(Animal const* animalArr[]) 48 { 49 Cat const* catPtr = 0; 50 Dog const* dogPtr = 0; 51 52 if (animalArr[0]->getType() == "Cat") { 53 catPtr = static_cast<Cat const*>(animalArr[0]); 54 std::cout << catPtr->getType() << std::endl; 55 catPtr->makeSound(); 56 } 57 else if (animalArr[0]->getType() == "Dog") { 58 dogPtr = static_cast<Dog const*>(animalArr[0]); 59 std::cout << dogPtr->getType() << std::endl; 60 dogPtr->makeSound(); 61 } 62 else 63 std::cout << "[INFO] : Weird animal detects in the animalArr" << std::endl; 64 65 if (animalArr[1]->getType() == "Cat") { 66 catPtr = static_cast<Cat const*>(animalArr[1]); 67 std::cout << catPtr->getType() << std::endl; 68 catPtr->makeSound(); 69 } 70 else if (animalArr[1]->getType() == "Dog") { 71 dogPtr = static_cast<Dog const*>(animalArr[1]); 72 std::cout << dogPtr->getType() << std::endl; 73 dogPtr->makeSound(); 74 } 75 else 76 std::cout << "[INFO] : Weird animal detects in the animalArr" << std::endl; 77 } 78 79 void testTwo(Cat* catPtr, Dog* dogPtr) 80 { 81 catPtr->learning("I hate Dog"); 82 std::cout << catPtr->getMemory() << std::endl; 83 dogPtr->learning("I like Cat!"); 84 std::cout << dogPtr->getMemory() << std::endl; 85 catPtr->thinking(catPtr->getMemory() - 1); 86 dogPtr->thinking(dogPtr->getMemory() - 1); 87 catPtr->learning("I really hate Dog"); 88 std::cout << catPtr->getMemory() << std::endl; 89 dogPtr->learning("I really like Cat!"); 90 std::cout << dogPtr->getMemory() << std::endl; 91 catPtr->thinking(catPtr->getMemory() - 1); 92 dogPtr->thinking(dogPtr->getMemory() - 1); 93 } 94 95 void testThree(Cat* cat, Dog* dog, Cat* catFriend, Dog* dogFriend) 96 { 97 std::cout << "[INFO] : Inside cat's brain..." << std::endl; 98 for (std::size_t i = 0; i < cat->getMemory(); i++) 99 cat->thinking(i); 100 std::cout << cat->getMemory() << std::endl; 101 std::cout << "[INFO] : Inside dog's brain..." << std::endl; 102 for (std::size_t i = 0; i < dog->getMemory(); i++) 103 dog->thinking(i); 104 std::cout << dog->getMemory() << std::endl; 105 catFriend->learning("Actually, I like Dog!"); 106 dogFriend->learning("Actually, I hate Cat"); 107 *cat = *catFriend; 108 *dog = *dogFriend; 109 std::cout << "[INFO] : Inside cat's brain..." << std::endl; 110 for (std::size_t i = 0; i < cat->getMemory(); i++) 111 cat->thinking(i); 112 std::cout << cat->getMemory() << std::endl; 113 std::cout << "[INFO] : Inside dog's brain..." << std::endl; 114 for (std::size_t i = 0; i < dog->getMemory(); i++) 115 dog->thinking(i); 116 std::cout << dog->getMemory() << std::endl; 117 } 118 119 int main(void) 120 { 121 Animal const* animalArr[10]; 122 123 for (std::size_t i = 0; i < 10; i++) { 124 switch (i & 1) 125 { 126 case 0: 127 animalArr[i] = new Cat(); 128 break; 129 case 1: 130 animalArr[i] = new Dog(); 131 break; 132 } 133 } 134 135 ATEXIT_CHECK(); 136 makeTestName("Test : Subject Test"); 137 subjectTest(); 138 makeTestName("Test 1 : Animal Array Test"); 139 testOne(animalArr); 140 makeTestName("Test 2 : Brain Test"); 141 Cat* cat = const_cast<Cat*>(static_cast<Cat const*>(animalArr[0])); 142 Dog* dog = const_cast<Dog*>(static_cast<Dog const*>(animalArr[1])); 143 testTwo(cat, dog); 144 makeTestName("Test 3 : Deep Copy Test"); 145 Cat* catFriend = const_cast<Cat*>(static_cast<Cat const*>(animalArr[2])); 146 Dog* dogFriend = const_cast<Dog*>(static_cast<Dog const*>(animalArr[3])); 147 testThree(cat, dog, catFriend, dogFriend); 148 149 std::cout << std::endl; 150 for (std::size_t i = 0; i < 10; i++) { 151 delete animalArr[i]; 152 } 153 return 0; 154 }