main.cpp
  1  /* ************************************************************************** */
  2  /*                                                                            */
  3  /*                                                        :::      ::::::::   */
  4  /*   main.cpp                                           :+:      :+:    :+:   */
  5  /*                                                    +:+ +:+         +:+     */
  6  /*   By: gychoi <gychoi@student.42seoul.kr>         +#+  +:+       +#+        */
  7  /*                                                +#+#+#+#+#+   +#+           */
  8  /*   Created: 2023/08/17 22:10:48 by gychoi            #+#    #+#             */
  9  /*   Updated: 2023/08/18 18:45:41 by gychoi           ###   ########.fr       */
 10  /*                                                                            */
 11  /* ************************************************************************** */
 12  
 13  #include "Character.hpp"
 14  #include "Cure.hpp"
 15  #include "Ice.hpp"
 16  #include "MateriaSource.hpp"
 17  #include <iostream>
 18  
 19  #ifdef LEAKS_CHECK
 20  # include <cstdlib>
 21  void	check_leaks(void)
 22  {
 23  	system("leaks --list -- a.out");
 24  }
 25  # define ATEXIT_CHECK() atexit(check_leaks)
 26  #else
 27  # define ATEXIT_CHECK()
 28  #endif
 29  
 30  void	makeTestName(std::string const& str)
 31  {
 32  	std::cout << "\n--------------------" << std::endl;
 33  	std::cout << str << std::endl;
 34  	std::cout << "--------------------\n" << std::endl;
 35  }
 36  
 37  void	testSubject(void)
 38  {
 39  	IMateriaSource* src = new MateriaSource();
 40  	src->learnMateria(new Ice());
 41  	src->learnMateria(new Cure());
 42  
 43  	ICharacter* me = new Character("me");
 44  
 45  	AMateria* tmp;
 46  	tmp = src->createMateria("ice");
 47  	me->equip(tmp);
 48  	tmp = src->createMateria("cure");
 49  	me->equip(tmp);
 50  
 51  	ICharacter* bob = new Character("bob");
 52  
 53  	me->use(0, *bob);
 54  	me->use(1, *bob);
 55  
 56  	delete bob;
 57  	delete me;
 58  	delete src;
 59  }
 60  
 61  void	testOne(void)
 62  {
 63  	IMateriaSource*	src = new MateriaSource();
 64  	src->learnMateria(new Ice());
 65  	src->learnMateria(new Ice());
 66  	src->learnMateria(new Ice());
 67  	src->learnMateria(new Ice());
 68  	src->learnMateria(new Ice());
 69  
 70  	static_cast<MateriaSource*>(src)->showMateria();
 71  
 72  	ICharacter*	me = new Character("me");
 73  
 74  	AMateria*	tmp;
 75  	tmp = src->createMateria("ice");
 76  	me->equip(tmp);
 77  	tmp = src->createMateria("cure");
 78  	me->equip(tmp);
 79  	tmp = src->createMateria("ice");
 80  	me->equip(tmp);
 81  	tmp = src->createMateria("ice");
 82  	me->equip(tmp);
 83  	tmp = src->createMateria("ice");
 84  	me->equip(tmp);
 85  	tmp = src->createMateria("ice");
 86  	// 릭이 발생하는 상황이지만, 서브젝트 지에 따라 아무것도 하지 말까...?
 87  	// floor를 만들기...?
 88  	me->equip(tmp);
 89  	delete tmp;
 90  
 91  	static_cast<Character*>(me)->showInventory();
 92  
 93  	ICharacter*	bob = new Character("bob");
 94  
 95  	IMateriaSource*	newSrc = new MateriaSource();
 96  	newSrc->learnMateria(new Cure());
 97  
 98  	AMateria*	foo;
 99  	foo = newSrc->createMateria("cure");
100  	bob->equip(foo);
101  
102  	static_cast<Character*>(bob)->showInventory();
103  
104  	bob->use(0, *me);
105  	bob->use(1, *me);
106  	bob->use(2, *me);
107  	bob->use(3, *me);
108  	bob->use(4, *me);
109  	me->use(0, *bob);
110  	me->use(1, *bob);
111  	me->use(2, *bob);
112  	me->use(3, *bob);
113  	me->use(4, *bob);
114  
115  	delete bob;
116  	delete me;
117  	delete src;
118  	delete newSrc;
119  }
120  
121  void	testTwo(void)
122  {
123  	IMateriaSource*	src = new MateriaSource();
124  	src->learnMateria(new Ice());
125  	src->learnMateria(new Cure());
126  
127  	AMateria*	foo = src->createMateria("ice");
128  	AMateria*	bar = src->createMateria("cure");
129  	std::cout << foo->getType() << std::endl;
130  	std::cout << bar->getType() << std::endl;
131  	*foo = *bar;
132  	std::cout << foo->getType() << std::endl;
133  	std::cout << bar->getType() << std::endl;
134  	AMateria*	baz = src->createMateria("ice");
135  	AMateria*	qux = src->createMateria("AK-47");
136  
137  	Character*	me = new Character("me");
138  	Character*	bob = new Character("bob");
139  	me->equip(foo);
140  	me->equip(qux);
141  	bob->equip(bar);
142  	bob->equip(baz);
143  	me->showInventory();
144  	bob->showInventory();
145  	*me = *bob;
146  	me->showInventory();
147  	bob->showInventory();
148  
149  	Character*	amy = new Character(*bob);
150  	amy->showInventory();
151  
152  	Character*	mike = new Character("mike");
153  	*bob = *mike;
154  	mike->showInventory();
155  	bob->showInventory();
156  
157  	delete src;
158  	delete me;
159  	delete bob;
160  	delete amy;
161  	delete mike;
162  }
163  
164  void	testThree(void)
165  {
166  	IMateriaSource* src = new MateriaSource();
167  	src->learnMateria(new Ice());
168  	src->learnMateria(new Cure());
169  
170  	ICharacter* me = new Character("me");
171  
172  	AMateria* tmp;
173  	tmp = src->createMateria("ice");
174  	me->equip(tmp);
175  	tmp = src->createMateria("cure");
176  	me->equip(tmp);
177  
178  	ICharacter* bob = new Character("bob");
179  
180  	AMateria const*	trash = static_cast<Character*>(me)->getItem(1);
181  	me->unequip(1);
182  	delete trash;
183  
184  	me->use(0, *bob);
185  	me->use(1, *bob);
186  
187  	delete bob;
188  	delete me;
189  	delete src;
190  }
191  
192  int	main(void)
193  {
194  	ATEXIT_CHECK();
195  	makeTestName("Test : Subject Test");
196  	testSubject();
197  	makeTestName("Test 1 : Check Simple Cases");
198  	testOne();
199  	makeTestName("Test 2 : Copy Test");
200  	testTwo();
201  	makeTestName("Test 3 : unequip Test");
202  	testThree();
203  	return 0;
204  }