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  }