νμ΄μ§λ₯Ό μμ±νλ©΄μ μμ±ν΄ λκ°λλ€. TDD μ°μ΅μ€μ΄λ μλ§ μ€κ° μ½μ§λ μμλλ€λ. ^^;
(5μ μ¦μλΆν° μμν¨)
μΈμ΄λ C++ λ‘ ν κ²μ΄κ³ μ€κ°μ STL μ€ vector λ₯Ό κ°λ¨νκ² μ΄μ©ν κ²λλ€. (μμΈν μ΄μ©λ²μ λλ λͺ¨λ₯΄λ κ΄κ³λ‘ -_-;) μΌλ¨ μ λ μ΄ λ¬Έμ λ₯Ό νλ² νμ΄λ³Έ μ μ΄ μμ΅λλ€. μ°μ΅μΌμμ μλ‘ νμ΄λ΄
λλ€.
λ¬Έμ λ μνΌ μ΄ν΄νκ³ (Input μ λν Output μ΄ λ¨Έλ¦Ώμμμ μ΄λ»κ² ν΄μΌ ν μ§ μ°κ²°μ΄ λ μν) κ°μ₯ κ°λ¨νκ² ν
μ€νΈν μ μλ λ°©λ²μ λν΄ μκ°ν΄μΌ νκ² κ΅°μ.
Sample Input μ 보λ λ€μ κ²μ΄ κ°λ¨ν΄ 보μ΄λκ΅°μ.
~cpp 2 1 1 2 100 2 1 1 200 1 1 2 1 2 2 1 2 2 1 0 0μ΄λ₯Ό TargetμΌλ‘ μ‘μΌλ €λ, λ 컀보μ΄κ³ , μ΄λ₯Ό μμ Test λ‘ λλ λ΄ λλ€.
~cpp 1 1 1 1 1 1 1 1
μ¬κΈ°μ μ μ CppUnit μ
ν
μ λ§μΆ°λκ³ .
~cpp
#include <cppunit/TestCase.h>
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/Ui/Text/TestRunner.h>
class TestOne : public CppUnit::TestCase {
public:
CPPUNIT_TEST_SUITE (TestOne);
CPPUNIT_TEST_SUITE_END();
};
int main ()
{
CppUnit::TextUi::TestRunner runner;
runner.run("", false);
return 0;
}
λ€μ κΆλ¦¬λͺ¨λ λμ
.
~cpp 1 1 1 1 1 1 1 1μμ ν μ€νΈ μ½λμμ μΈν νμ±μ μΌλ¨ 미리 μκ°ν νμκ° μμΌλ.
~cpp configuration 1,1 λ‘ μ ν 1->1 λ‘ 1λͺ κ°κΈ° μ΄λ΄ λ, traffic μ ꡬνλ©΄ 1λͺ μ΄ λμ¨λ€.
ν. 30λΆλμ νλ¦°νΈ νμ λ€κ³ μ리νμνμ λΆ λλ¬Έμ μ§μ°. -_-; λ€μ μμ;
~cpp
class TestOne : public CppUnit::TestCase {
public:
CPPUNIT_TEST_SUITE (TestOne);
CPPUNIT_TEST (test1);
CPPUNIT_TEST_SUITE_END();
void test1 () {
Configuration* conf = new Configuration (1,1);
conf->movePeople (1,1,1);
CPPUNIT_ASSERT_EQUAL (1, conf->getTraffic ());
}
};
μ΄μ λν μ½λ μμ±
λ°°μ΄μ λκΈ°λ λ°©λ²μ΄ μκ³ , vector λ₯Ό μ΄μ©νλ λ°©λ²μ΄ μμ΅λλ€. μ λ²μλ λ°°μ΄λ‘ νκΈ° λλ¬Έμ μ΄λ²μ vector λ‘ ν΄λ³Έλ€λ. ^^;
~cpp
class Configuration {
int startCity;
int endCity;
public:
Configuration (int startCity, int endCity) {
this->startCity = startCity;
this->endCity = endCity;
}
void movePeople (int startCity, int endCity, int people) {
}
int getTraffic () {
return 1;
}
};
~cpp
void test1 () {
Configuration* conf = new Configuration (1,1);
conf->movePeople(1,1,1);
CPPUNIT_ASSERT_EQUAL (1, conf->getTraffic ());
conf->movePeople(1,1,1);
CPPUNIT_ASSERT_EQUAL (2, conf->getTraffic ());
}
~cpp
void movePeople (int startCity, int endCity, int people) {
traffic += people;
}
int getTraffic () {
return traffic;
}
~cpp conf->movePeople(1,1,100); CPPUNIT_ASSERT_EQUAL (102, conf->getTraffic ());μ¬κΈ°κΉμ§ ν΅κ³Ό..~ test code λ₯Ό Refactoring ν΄λ΄ λλ€.
~cpp
void testOneToOneMove () {
int dataset [3][3] = {{1,1,1}, {1,1,1}, {1,1,100}};
int expectedSet[3] = {1,2,102};
Configuration* conf = new Configuration (1,1);
for (int i=0;i<3;i++) {
conf->movePeople(dataset[i][0],dataset[i][1],dataset[i][2]);
CPPUNIT_ASSERT_EQUAL (expectedSet[i], conf->getTraffic ());
}
delete conf;
}
ν΅κ³Όν ν
μ€νΈ~cpp configuration 1,1 λ‘ μ ν 1->1 λ‘ 1λͺ κ°κΈ° : traffic 1. 1->1 λ‘ 1λͺ λ κ°κΈ° : traffic 2. 1->1 λ‘ 100λͺ λ κ°κΈ° : traffic 102.λ€μ ν μ€νΈμ μκ°
~cpp
configuration {1,2},{1,2} λ‘ μ
ν
1->2 λ‘ 1λͺ
κ°κΈ° : traffic 2.
~cpp
void testOneToTwoMove () {
int arrivalCitys[] = {1,2};
int departureCitys[] = {1,2};
Configuration* conf = new Configuration (arrivalCitys, departureCitys);
conf->movePeople(1,2,1);
CPPUNIT_ASSERT_EQUAL(2, conf->getTraffic());
delete conf;
}
μλ¬κ° λλ€. C++ μμλ ν°νμ΄ μμΌλ―λ‘..
λ°°μ΄μ λκΈ°λ λ°©λ²μ΄ μκ³ , vector λ₯Ό μ΄μ©νλ λ°©λ²μ΄ μμ΅λλ€. μ λ²μλ λ°°μ΄λ‘ νκΈ° λλ¬Έμ μ΄λ²μ vector λ‘ ν΄λ³Έλ€λ. ^^;~cpp
void testOneToTwoMove () {
vector <int> arrivalCitys;
vector <int> departureCitys;
arrivalCitys.push_back(1);
arrivalCitys.push_back(2);
departureCitys.push_back(1);
departureCitys.push_back(2);
Configuration* conf = new Configuration (arrivalCitys, departureCitys);
conf->movePeople(1,2,1);
CPPUNIT_ASSERT_EQUAL(2, conf->getTraffic());
delete conf;
}
μ»΄νμΌ μλ¬. ~cpp
--------------------Configuration: AirportSec - Win32 Debug--------------------
Compiling...
main.cpp
C:\User\reset\AirportSec\main.cpp(57) : error C2664: '__thiscall Configuration::Configuration(int,int)' : cannot convert parameter 1 from 'class std::vector<int,class std::allocator<int> >' to 'int'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
Error executing cl.exe.
AirportSec.exe - 1 error(s), 0 warning(s)
μμ, λ©μΈ μ½λλ μμ νμλ₯Ό μλ €μ€λ€.~cpp
Configuration (vector<int> startCity, vector<int> endCity) {
this->startCity = startCity;
this->endCity = endCity;
this->traffic = 0;
}
void movePeople (int startCity, int endCity, int people) {
traffic += people;
}
int getTraffic () {
return traffic;
}
μ΄ κ²½μ° testOneToOneMove κ° κΉ¨μ§κ² λλ€. λ°μ΄ν°νμ΄ λ€λ₯΄κΈ° λλ¬Έμ΄λ€. testOneToOneMove μͺ½ ν
μ€νΈ νμ λκ°μ΄ μμ±ν΄μ€λ€.~cpp
void testOneToOneMove () {
int dataset [3][3] = {{1,1,1}, {1,1,1}, {1,1,100}};
int expectedSet[3] = {1,2,102};
vector<int> arrivalCitys;
vector<int> depatureCitys;
arrivalCitys.push_back(1);
depatureCitys.push_back(1);
Configuration* conf = new Configuration (arrivalCitys,depatureCitys);
κ²°κ³Ό :~cpp 1) test: TestOne::testOneToTwoMove (F) line: 66 C:\User\reset\AirportSec\main.c p equality assertion failed - Expected: 2 - Actual : 1 Press any key to continue
λ€μ ν
μ€νΈκ° κΉ¨μ§λ€.
movePeople μ μ¬μ μ.
~cpp
void movePeople (int startCity, int endCity, int people) {
traffic += getDistance () * people;
}
6:46 λ°₯λ¨ΉμΌλ¬ κ°;7:50 λ€μ μμ μμ . ^^;
getDistance ()μ κ²½μ° λ city gate κ°μ 거리μ΄λ€. μΌλ¨ μ€ν
μ½λλ₯Ό μμ±ν΄λκ³ ,
~cpp
int getDistance () {
return 0;
}
λ€μκ³Ό κ°μ΄ ν
μ€νΈλ₯Ό λ€μ μμ±ν μ μλ€.~cpp
void testGetDistance () {
vector <int> arrivalCitys;
vector <int> departureCitys;
arrivalCitys.push_back(1);
departureCitys.push_back(1);
Configuration* conf = new Configuration (arrivalCitys, departureCitys);
CPPUNIT_ASSERT_EQUAL(1, conf->getDistance(1,1));
}
~cpp -------------------Configuration: AirportSec - Win32 Debug-------------------- Compiling... main.cpp C:\User\reset\AirportSec\main.cpp(84) : error C2660: 'getDistance' : function does not take 2 parameters Error executing cl.exe. AirportSec.exe - 1 error(s), 0 warning(s)μ»΄νμΌλ¬κ° μΈμ 2κ°μ§λ¦¬ Interface μ΄κΈ°λ₯Ό μμ²νλ€. μμ²λλ‘ ν΄μ£Όμ.
~cpp
int getDistance (int startCity, int endCity) {
return 0;
}
κ·Έμ λ°λΌ λ€μκ³Ό κ°μ μλ¬κ° λλ€.
~cpp --------------------Configuration: AirportSec - Win32 Debug-------------------- Compiling... main.cpp C:\User\reset\AirportSec\main.cpp(24) : error C2660: 'getDistance' : function does not take 0 parameters Error executing cl.exe. AirportSec.exe - 1 error(s), 0 warning(s)24 λΌμΈμ movePeople.
~cpp
void movePeople (int startCity, int endCity, int people) {
traffic += getDistance () * people;
}
μ΄ μΈν°νμ΄μ€λ μμ νκΈΈ μ»΄νμΌλ¬κ° λ°λΌκ³ μλ€. μνλλλ‘ ν΄μ£Όμ.~cpp
void movePeople (int startCity, int endCity, int people) {
traffic += getDistance (startCity, endCity) * people;
}
~cpp 1) test: TestOne::testOneToOneMove (F) line: 54 C:\User\reset\AirportSec\main.cpp equality assertion failed - Expected: 1 - Actual : 0 2) test: TestOne::testOneToTwoMove (F) line: 71 C:\User\reset\AirportSec\main.cpp equality assertion failed - Expected: 2 - Actual : 0 3) test: TestOne::testGetDistance (F) line: 84 C:\User\reset\AirportSec\main.cpp equality assertion failed - Expected: 1 - Actual : 0κΈ°μ‘΄μ ν μ€νΈλ€μ΄ μ λΆ κΉ¨μ‘λ€. κΈ°μ‘΄μ ν μ€νΈλ getTraffic μ κ΄λ ¨ν λΆλΆμ΄κ³ , μ°λ¦¬κ° μμ ν λΆλΆμ getDistance μ΄λ€. getDistance μ μ΄μ μ λ§μΆμ.
~cpp
int getDistance (int startCity, int endCity) {
return 0;
}
μΌλ¨μ λ€μκ³Ό κ°μ΄. μ΄μ μ λ§μΆ°μΌ ν λΆλΆμ testGetDistance.~cpp
int getDistance (int startCity, int endCity) {
return 1;
}
~cpp
void testGetDistance2() {
vector <int> arrivalCitys;
vector <int> departureCitys;
arrivalCitys.push_back(1);
arrivalCitys.push_back(2);
departureCitys.push_back(1);
departureCitys.push_back(2);
Configuration* conf = new Configuration (arrivalCitys, departureCitys);
CPPUNIT_ASSERT_EQUAL(2, conf->getDistance(1,2));
delete conf;
}
getDistance μ λν΄ refinement ν΄μ£Όμ.~cpp
int getDistance (int startCity, int endCity) {
return abs (getStartGateIndex(startCity) - getEndGateIndex(endCity)) + 1;
}
int getStartGateIndex (int startCity) {
for (int cityIndex=0; cityIndex < this->startCity.size(); cityIndex++) {
if (this->startCity[cityIndex] == startCity) {
return cityIndex;
}
}
return -1;
}
int getEndGateIndex (int endCity) {
for (int cityIndex=0; cityIndex < this->endCity.size(); cityIndex++) {
if (this->endCity[cityIndex] == endCity) {
return cityIndex;
}
}
return -1;
}
μ¬κΈ°μ Test - Code μ μκ°μ΄ κ½€ κΈΈμλ€. (9λΆ) ν¨μ refinement λΆλΆμμ STL μ μλ find ν¨μλ₯Ό ν¨ μ¨λ¨Ήμ΄ λ³΄λ €κ³ νλ€κ°;; κ²°κ΅μ νμ νλλ°λ‘ νλ€. ^^;Refactoring - μ€λ³΅μμ κΈ°.
~cpp
int find (vector<int>& cities, int city) {
for (int cityIndex=0; cityIndex < cities.size(); cityIndex++) {
if (cities[cityIndex] == city) {
return cityIndex;
}
}
return -1;
}
μ¬κΈ°μ μ§κΈκΉμ§ μκ°ν test λ€μ μ λΆ pass νλ€. μμΌλ‘ λ ν΄μΌ ν μΌμ΄ μκ°λμ§ μμμ, νλ² μ€μ λ©μΈν
μ€νΈμ μ€νλ ν
μ€νΈλ₯Ό ν΄ λ³΄μλ€. μ¦,~cpp 2 1 1 2 100 2 1 1 200 1 1 2 1 2 0 0μ λν΄μ traffic μ΄ 600 μ΄ λμ€λ κ²μ νμΈνλ ν μ€νΈ.
~cpp
void testRealOne () {
vector<int> arrivalCitys;
vector<int> departureCitys;
arrivalCitys.push_back(1);
arrivalCitys.push_back(2);
departureCitys.push_back(1);
departureCitys.push_back(2);
Configuration* conf = new Configuration (arrivalCitys, departureCitys);
conf->movePeople(1,2, 100);
conf->movePeople(2,1, 200);
CPPUNIT_ASSERT_EQUAL(600, conf->getTraffic());
delete conf;
}
κ²°κ³Ό : ok. Configurationμ μ€μ§μ μΈ λ°μ΄ν°κΉμ§λ νΈλ ν½μ κ³μ°ν μ μλ μμ€κΉμ§ λμλ€. ν
μ€νΈλ₯Ό μ’ λ λΆμ¬λ³΄μ. μ’ λ μ΄λ €μ΄ κ²½μ°μΈ μλ¨κ³μ λ°μ΄ν°μ λν΄ ν΄λ³΄μ.~cpp 1 2 2 10 3 15 2 1 3 10 3 2 1 12 2 20 1 1 2 3 2 3 1 0 0μΌλ traffic 122 κ° λμμΌ νλ€.
~cpp
void testRealTwo () {
vector<int> arrivalCitys;
vector<int> departureCitys;
arrivalCitys.push_back(1);
arrivalCitys.push_back(2);
arrivalCitys.push_back(3);
departureCitys.push_back(2);
departureCitys.push_back(3);
departureCitys.push_back(1);
Configuration* conf = new Configuration (arrivalCitys, departureCitys);
conf->movePeople(1,2,10);
conf->movePeople(1,3,15);
conf->movePeople(2,3,10);
conf->movePeople(3,1,12);
conf->movePeople(3,2,20);
CPPUNIT_ASSERT_EQUAL(122, conf->getTraffic());
delete conf;
}
pass λμλ€. μ무λλ νλ² λ―Έλ¦¬ μ§λ³Έ νλ‘κ·Έλ¨μ΄μ¬μ κ·Έλ°μ§ μ΄λ°μ μΌλ°νλ κ²μ΄ μλκΉ νλ μκ°μ΄ λ λ€.Refactoring νκΈ° μ νμ¬ μμ€.
~cpp
#include <cppunit/TestCase.h>
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/Ui/Text/TestRunner.h>
#include <vector>
#include <algorithm>
using namespace std;
class Configuration {
vector<int> startCity;
vector<int> endCity;
int traffic;
public:
Configuration (vector<int> startCity, vector<int> endCity) {
this->startCity = startCity;
this->endCity = endCity;
this->traffic = 0;
}
int find (vector<int>& cities, int city) {
for (int cityIndex=0; cityIndex < cities.size(); cityIndex++) {
if (cities[cityIndex] == city) {
return cityIndex;
}
}
return -1;
}
int getStartGateIndex (int startCity) {
return find (this->startCity, startCity);
}
int getEndGateIndex (int endCity) {
return find (this->endCity, endCity);
}
int getDistance (int startCity, int endCity) {
return abs (getStartGateIndex(startCity) - getEndGateIndex(endCity)) + 1;
}
void movePeople (int startCity, int endCity, int people) {
this->traffic += getDistance (startCity, endCity) * people;
}
int getTraffic () {
return this->traffic;
}
};
class TestOne : public CppUnit::TestCase {
public:
CPPUNIT_TEST_SUITE (TestOne);
CPPUNIT_TEST (testOneToOneMove);
CPPUNIT_TEST (testOneToTwoMove);
CPPUNIT_TEST (testGetDistance);
CPPUNIT_TEST (testGetDistance2);
CPPUNIT_TEST (testRealOne);
CPPUNIT_TEST (testRealTwo);
CPPUNIT_TEST_SUITE_END();
void testOneToOneMove () {
int dataset [3][3] = {{1,1,1}, {1,1,1}, {1,1,100}};
int expectedSet[3] = {1,2,102};
vector<int> arrivalCitys;
vector<int> depatureCitys;
arrivalCitys.push_back(1);
depatureCitys.push_back(1);
Configuration* conf = new Configuration (arrivalCitys,depatureCitys);
for (int i=0;i<3;i++) {
conf->movePeople(dataset[i][0],dataset[i][1],dataset[i][2]);
CPPUNIT_ASSERT_EQUAL (expectedSet[i], conf->getTraffic ());
}
delete conf;
}
void testOneToTwoMove () {
vector <int> arrivalCitys;
vector <int> departureCitys;
arrivalCitys.push_back(1);
arrivalCitys.push_back(2);
departureCitys.push_back(1);
departureCitys.push_back(2);
Configuration* conf = new Configuration (arrivalCitys, departureCitys);
conf->movePeople(1,2,1);
CPPUNIT_ASSERT_EQUAL(2, conf->getTraffic());
delete conf;
}
void testGetDistance () {
vector <int> arrivalCitys;
vector <int> departureCitys;
arrivalCitys.push_back(1);
departureCitys.push_back(1);
Configuration* conf = new Configuration (arrivalCitys, departureCitys);
CPPUNIT_ASSERT_EQUAL(1, conf->getDistance(1,1));
delete conf;
}
void testGetDistance2() {
vector <int> arrivalCitys;
vector <int> departureCitys;
arrivalCitys.push_back(1);
arrivalCitys.push_back(2);
departureCitys.push_back(1);
departureCitys.push_back(2);
Configuration* conf = new Configuration (arrivalCitys, departureCitys);
CPPUNIT_ASSERT_EQUAL(2, conf->getDistance(1,2));
delete conf;
}
void testRealOne () {
vector<int> arrivalCitys;
vector<int> departureCitys;
arrivalCitys.push_back(1);
arrivalCitys.push_back(2);
departureCitys.push_back(1);
departureCitys.push_back(2);
Configuration* conf = new Configuration (arrivalCitys, departureCitys);
conf->movePeople(1,2, 100);
conf->movePeople(2,1, 200);
CPPUNIT_ASSERT_EQUAL(600, conf->getTraffic());
delete conf;
}
void testRealTwo () {
vector<int> arrivalCitys;
vector<int> departureCitys;
arrivalCitys.push_back(1);
arrivalCitys.push_back(2);
arrivalCitys.push_back(3);
departureCitys.push_back(2);
departureCitys.push_back(3);
departureCitys.push_back(1);
Configuration* conf = new Configuration (arrivalCitys, departureCitys);
conf->movePeople(1,2,10);
conf->movePeople(1,3,15);
conf->movePeople(2,3,10);
conf->movePeople(3,1,12);
conf->movePeople(3,2,20);
CPPUNIT_ASSERT_EQUAL(122, conf->getTraffic());
delete conf;
}
};
int main ()
{
CppUnit::TextUi::TestRunner runner;
runner.addTest (TestOne::suite());
runner.run("", false);
return 0;
}
ν
μ€νΈ μ½λ© Refactoring - μΌ.. μ¬μ ν μκ°μ΄ λ§μ΄ κ±Έλ¦°λ€. μ£Όλ‘ μ€λ³΅μ μμ λ λ°©ν₯μΌλ‘ μ κ·Ό.
~cpp
#ifndef _CONFIGURATION_H_
#define _CONFIGURATION_H_
#include <vector>
using namespace std;
class Configuration {
vector<int> startCity;
vector<int> endCity;
int traffic;
public:
Configuration (vector<int> startCity, vector<int> endCity) {
this->startCity = startCity;
this->endCity = endCity;
this->traffic = 0;
}
int find (vector<int>& cities, int city) {
for (int cityIndex=0; cityIndex < cities.size(); cityIndex++) {
if (cities[cityIndex] == city) {
return cityIndex;
}
}
return -1;
}
int getStartGateIndex (int startCity) {
return find (this->startCity, startCity);
}
int getEndGateIndex (int endCity) {
return find (this->endCity, endCity);
}
int getDistance (int startCity, int endCity) {
return abs (getStartGateIndex(startCity) - getEndGateIndex(endCity)) + 1;
}
void movePeople (int startCity, int endCity, int people) {
this->traffic += getDistance (startCity, endCity) * people;
}
int getTraffic () {
return this->traffic;
}
};
#endif
history λ₯Ό 보λ 30λΆμ λ κ±Έλ Έκ΅°μ. ν ..κ·Έλ¬λ€κ° 보λ, ν
μ€νΈ μ½λμμ μμ£Ό μ€λ³΅μ΄ λνλλ λΆλΆμ΄ λμ λ€λ€.
~cpp
int arrivalData[] = {1,2};
int departureData[] = {1,2};
conf = new Configuration (arrivalCitys, departureCitys);
μμΌλ‘ μ€μ λλ Configuration λΆλΆ. setUp λΆλΆ λ¬Άμ΄μ Configuration μ λν ν
μ€νΈλ₯Ό λκ°λ‘ λ¬ΆκΈ°λ‘ νλ€.
~cpp
#ifndef _TEST_CONFIGURATION_H_
#define _TEST_CONFIGURATION_H_
#include <cppunit/TestCase.h>
#include <cppunit/extensions/HelperMacros.h>
#include <vector>
using namespace std;
void intVectorInit (vector<int>& vec, int* intList, int count) {
for (int i=0;i<count;i++) {
vec.push_back(intList[i]);
}
}
void movePeople (Configuration* conf, int moveDataSet[][3], int moveCount) {
for (int i=0;i<moveCount;i++) {
conf->movePeople(moveDataSet[i][0], moveDataSet[i][1], moveDataSet[i][2]);
}
}
class TestConfigurationBasic : public CppUnit::TestCase {
CPPUNIT_TEST_SUITE (TestConfigurationBasic);
CPPUNIT_TEST (testOneToOneMove);
CPPUNIT_TEST (testGetDistance);
CPPUNIT_TEST_SUITE_END();
public:
Configuration* conf;
vector<int> arrivalCitys;
vector<int> departureCitys;
void setUp () {
conf = NULL;
}
void tearDown () {
if (conf) delete conf;
arrivalCitys.clear();
departureCitys.clear();
}
void testOneToOneMove () {
int moveDataSet [3][3] = {{1,1,1}, {1,1,1}, {1,1,100}};
int expectedSet[3] = {1,2,102};
arrivalCitys.push_back(1);
departureCitys.push_back(1);
conf = new Configuration (arrivalCitys,departureCitys);
for (int i=0;i<3;i++) {
conf->movePeople(moveDataSet[i][0],moveDataSet[i][1],moveDataSet[i][2]);
CPPUNIT_ASSERT_EQUAL (expectedSet[i], conf->getTraffic ());
}
}
void testGetDistance () {
vector <int> arrivalCitys;
vector <int> departureCitys;
arrivalCitys.push_back(1);
departureCitys.push_back(1);
conf = new Configuration (arrivalCitys, departureCitys);
CPPUNIT_ASSERT_EQUAL(1, conf->getDistance(1,1));
}
};
class TestConfigurationCityTwo : public CppUnit::TestCase {
CPPUNIT_TEST_SUITE (TestConfigurationCityTwo);
CPPUNIT_TEST (testOneToTwoMove);
CPPUNIT_TEST (testGetDistance2);
CPPUNIT_TEST (testRealOne);
CPPUNIT_TEST_SUITE_END();
public:
Configuration* conf;
vector<int> arrivalCitys;
vector<int> departureCitys;
void setUp () {
conf = NULL;
int arrivalData[] = {1,2};
int departureData[] = {1,2};
intVectorInit (arrivalCitys, arrivalData, 2);
intVectorInit (departureCitys, departureData, 2);
}
void tearDown() {
if (conf) delete conf;
arrivalCitys.clear();
departureCitys.clear();
}
void testOneToTwoMove () {
conf = new Configuration (arrivalCitys, departureCitys);
conf->movePeople(1,2,1);
CPPUNIT_ASSERT_EQUAL(2, conf->getTraffic());
}
void testGetDistance2() {
conf = new Configuration (arrivalCitys, departureCitys);
CPPUNIT_ASSERT_EQUAL(2, conf->getDistance(1,2));
}
void testRealOne () {
int moveDataSet[2][3] = {{1,2,100}, {2,1,200}};
conf = new Configuration (arrivalCitys, departureCitys);
movePeople (conf, moveDataSet, 2);
CPPUNIT_ASSERT_EQUAL(600, conf->getTraffic());
}
};
class TestConfigurationCityThree : public CppUnit::TestCase {
CPPUNIT_TEST_SUITE(TestConfigurationCityThree);
CPPUNIT_TEST (testRealTwo);
CPPUNIT_TEST_SUITE_END();
public:
Configuration* conf;
vector<int> arrivalCitys;
vector<int> departureCitys;
void setUp () {
conf = NULL;
}
void tearDown () {
if (conf) delete conf;
arrivalCitys.clear();
departureCitys.clear();
}
void testRealTwo () {
int arrivalData[] = {1,2,3};
int departureData[] = {2,3,1};
int moveDataSet[5][3] = {{1,2,10}, {1,3,15}, {2,3,10}, {3,1,12}, {3,2,20}};
intVectorInit (arrivalCitys, arrivalData, 3);
intVectorInit (departureCitys, departureData, 3);
conf = new Configuration (arrivalCitys, departureCitys);
movePeople (conf, moveDataSet, 5);
CPPUNIT_ASSERT_EQUAL(122, conf->getTraffic());
}
};
#endif
κ·Όλ°, Refactoring μ λν΄μλ§ 1μκ°μ μ΄ κ² κ°λ€. κ·Έκ²λ λ©μΈ μ½λμΈ Configuration ν΄λμ€ λ³΄λ¨, Test μ½λμ λν Refactoring μ΄ μ£Όκ° λ κ² κ°λ€. μ€μ§μ μΈ μ€μ©μ±μ λ³Όλ, λ©μΈ μ½λμ λν Refactoring μμ£Όλ‘ λκ°λ κ²μ΄ μ’μ κ² κ°λ€. (κΉ¨μ§ Test λ μ£Όλ‘ μμ νλ μ€νμΌλ‘ κ°κ³ ..)Configuration νλμ λν΄μλ λ κ² κ°κ³ . λ ν
μ€νΈ λ€μ΄κ° κ²μ΄ μμκΉ... μκ°νλμ€, μ΄μ λ μ¬λ¬κ°μ λ°μ΄ν°κ° λ€μ΄κ°μΌκ² λ€λ μκ°μ νκ² λμλ€. μ¦, Configuration μ΄ 2κ°μΈ κ²½μ°μ λν΄μ.
Configuration μ΄ 2κ°μΈ κ²½μ°μ λν΄μ. μ΄ Configuration μ κ°μ§κ³ μλ κ²μ Airport λΌκ³ μμ μ§λλ‘ νκ² λ€. Airport λ Configuration μ λ±λ‘ν μ μμΌλ©°, κ°κ°μ Configuration κ²½μ°μ λν Traffic λ€μ κ° Configuration μκ² λ¬Όμ΄λ΄μΌλ‘μ κ³μ°λ Traffic λ€μ μ μ μλ€.
Configuration μ΄ 2κ°μΈ κ²½μ°μ λν΄μ. μ΄ Configuration μ κ°μ§κ³ μλ κ²μ Airport λΌκ³ μμ μ§λλ‘ νκ² λ€. Airport λ Configuration μ λ±λ‘ν μ μμΌλ©°, κ°κ°μ Configuration κ²½μ°μ λν Traffic λ€μ κ° Configuration μκ² λ¬Όμ΄λ΄μΌλ‘μ κ³μ°λ Traffic λ€μ μ μ μλ€.
κ°λ¨ν λλ²μ§Έμ κ²½μ° μλ₯Ό λ¨Όμ λ λ€λ©΄.
~cpp 1 1 2 100 2 1 1 200 1 1 2 1 2 2 1 2 2 1 0 0κ° κ²½μ°μ λν΄ μ²«λ²μ§Έ traffic μ 600μ΄, λλ²μ§Έ traffic μ 300 μ΄ λμμΌ νλ€.
~cpp
class TestAirport : public CppUnit::TestCase {
CPPUNIT_TEST_SUITE (TestAirport);
CPPUNIT_TEST (testOne);
CPPUNIT_TEST_SUITE_END();
public:
Configuration* conf1;
Configuration* conf2;
vector<int> arrivalCitys;
vector<int> departureCitys;
vector<int> arrivalCitys2;
vector<int> departureCitys2;
void setUp () {
int arrivalData[] = {1,2};
int departureData[] = {1,2};
intVectorInit (arrivalCitys, arrivalData, 2);
intVectorInit (departureCitys, departureData, 2);
conf1 = new Configuration (arrivalCitys, departureCitys);
int arrivalData2[] = {1,2};
int departureData2[] = {2,1};
intVectorInit (arrivalCitys2, arrivalData, 2);
intVectorInit (departureCitys2, departureData, 2);
conf2 = new Configuration (arrivalCitys2, departureCitys2);
}
void tearDown () {
delete conf1;
delete conf2;
arrivalCitys.clear();
departureCitys.clear();
arrivalCitys2.clear();
departureCitys2.clear();
}
void testOne () {
Airport* airport = new Airport();
airport->registerConfiguration (conf1);
airport->registerConfiguration (conf2);
airport->movePeople (1,2,100);
airport->movePeople (2,1,200);
CPPUNIT_ASSERT_EQUAL (600, airport->getTraffic(0));
CPPUNIT_ASSERT_EQUAL (300, airport->getTraffic(1));
}
};
airport κ΄λ ¨ μ½λ ꡬν.
~cpp
void movePeople (int startCity, int endCity, int people) {
for (int i=0;i< this->configurations.size();i++) {
this->configurations[i]->movePeople(startCity, endCity, people);
}
}
κ²°κ³Ό :~cpp 1) test: TestAirport::testOne (F) line: 72 c:\user\reset\airportsec\testairport.h equality assertion failed - Expected: 300 - Actual : 600μ λλ²μ§Έ configuration μ κ²½μ°μ λν΄μ μλ¬μΌκΉ? λ€μ configuration μΌλ‘; ν μ€νΈλ₯Ό λ μΆκ°ν΄ 보μλ€.
~cpp
void testGetDistance2to1() {
CPPUNIT_ASSERT_EQUAL(2, conf->getDistance(2,1));
}
λ©μ©‘νλ€. κ·Έλμ, Configuration μ λν ν
μ€νΈλ₯Ό λ μμ±νμλ€.~cpp
void testTwoToOneMove () {
int arrivalData[] = {1,2};
int departureData[] = {2,1};
intVectorInit (arrivalCitys, arrivalData, 2);
intVectorInit (departureCitys, departureData, 2);
conf = new Configuration (arrivalCitys, departureCitys);
conf->movePeople(1,2,100);
CPPUNIT_ASSERT_EQUAL(100, conf->getTraffic());
}
~cpp // μΆκ°λ ν μ€νΈ conf->movePeople(2,1,200); CPPUNIT_ASSERT_EQUAL(300, conf->getTraffic());μλμ μ νλ€; λ¬Έμ λ μ΄μ Airport μͺ½μΌλ‘ μΆμλλ λ― νλ€.
~cpp // λ¬Έμ λ°κ²¬! - AirportTest::setUp()
int arrivalData2[] = {1,2};
int departureData2[] = {2,1};
intVectorInit (arrivalCitys2, arrivalData, 2); // <-- arrivalData2 λ‘ μ΄κΈ°νλμ΄μΌ νλ€.
intVectorInit (departureCitys2, departureData, 2); // μμ λν;
~cpp ......... OK (9 tests)
λ€λ₯Έ ν
μ€νΈμ λν΄μλ ν΄λ³΄μ.
~cpp
void testGetTraffics2 () {
int arrivalData[] = {1,2,3};
int departureData[] = {2,3,1};
intVectorInit (arrivalCitys, arrivalData, 3);
intVectorInit (departureCitys, departureData, 3);
conf1 = new Configuration (arrivalCitys, departureCitys);
int arrivalData2[] = {2,3,1};
int departureData2[] = {3,2,1};
intVectorInit (arrivalCitys2, arrivalData2, 3);
intVectorInit (departureCitys2, departureData2, 3);
conf2 = new Configuration (arrivalCitys2, departureCitys2);
Airport* airport = new Airport();
airport->registerConfiguration (conf1);
airport->registerConfiguration (conf2);
airport->movePeople (1,2,10);
airport->movePeople (1,3,15);
airport->movePeople (2,3,10);
airport->movePeople (3,1,12);
airport->movePeople (3,2,20);
CPPUNIT_ASSERT_EQUAL (122, airport->getTraffic(0));
CPPUNIT_ASSERT_EQUAL (119, airport->getTraffic(1));
delete airport;
}
Sort κ²°κ³Ό ν
μ€νΈ.~cpp
void testSortedResult () {
int arrivalData[] = {1,2,3};
int departureData[] = {2,3,1};
intVectorInit (arrivalCitys, arrivalData, 3);
intVectorInit (departureCitys, departureData, 3);
conf1 = new Configuration (arrivalCitys, departureCitys);
int arrivalData2[] = {2,3,1};
int departureData2[] = {3,2,1};
intVectorInit (arrivalCitys2, arrivalData2, 3);
intVectorInit (departureCitys2, departureData2, 3);
conf2 = new Configuration (arrivalCitys2, departureCitys2);
Airport* airport = new Airport();
airport->registerConfiguration (conf1);
airport->registerConfiguration (conf2);
airport->movePeople (1,2,10);
airport->movePeople (1,3,15);
airport->movePeople (2,3,10);
airport->movePeople (3,1,12);
airport->movePeople (3,2,20);
vector<Configuration*> configurations = airport->getSortedResult ();
CPPUNIT_ASSERT_EQUAL (119, configurations[0]->getTraffic());
CPPUNIT_ASSERT_EQUAL (122, configurations[1]->getTraffic());
CPPUNIT_ASSERT_EQUAL (122, airport->getTraffic(0));
CPPUNIT_ASSERT_EQUAL (119, airport->getTraffic(1));
delete airport;
}










