<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=VonNeumannAirport%2F1002</id>
	<title>VonNeumannAirport/1002 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=VonNeumannAirport%2F1002"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=VonNeumannAirport/1002&amp;action=history"/>
	<updated>2026-05-14T08:54:55Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=VonNeumannAirport/1002&amp;diff=40089&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:28, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=VonNeumannAirport/1002&amp;diff=40089&amp;oldid=prev"/>
		<updated>2021-02-07T05:28:23Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;페이지를 작성하면서 작성해 나갑니다. TDD 연습중이니 아마 중간 삽질도 예상된다는. ^^;&lt;br /&gt;
&lt;br /&gt;
(5시 즈음부터 시작함)&lt;br /&gt;
&lt;br /&gt;
언어는 C++ 로 할 것이고 중간에 STL 중 vector 를 간단하게 이용할겁니다. (자세한 이용법은 나도 모르는 관계로 -_-;) 일단 저는 이 문제를 한번 풀어본 적이 있습니다. 연습삼아서 새로 풀어봅니다. &lt;br /&gt;
&lt;br /&gt;
문제는 암튼 이해했고 (Input 에 대한 Output 이 머릿속에서 어떻게 해야 할지 연결이 된 상태) 가장 간단하게 테스트할 수 있는 방법에 대해 생각해야 하겠군요.&lt;br /&gt;
&lt;br /&gt;
Sample Input 을 보니 뒤의 것이 간단해 보이는군요.&lt;br /&gt;
 2&lt;br /&gt;
 1 1 2 100&lt;br /&gt;
 2 1 1 200&lt;br /&gt;
 1&lt;br /&gt;
 1 2&lt;br /&gt;
 1 2&lt;br /&gt;
 2&lt;br /&gt;
 1 2 &lt;br /&gt;
 2 1&lt;br /&gt;
 0&lt;br /&gt;
 0&lt;br /&gt;
이를 Target으로 잡으려니, 더 커보이고, 이를 작은 Test 로 나눠봅니다.&lt;br /&gt;
 1&lt;br /&gt;
 1 1 1 1&lt;br /&gt;
 1&lt;br /&gt;
 1 &lt;br /&gt;
 1&lt;br /&gt;
&lt;br /&gt;
여기서 잠시 CppUnit 셋팅을 맞춰놓고.&lt;br /&gt;
 #include &amp;amp;lt;cppunit/TestCase.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;cppunit/extensions/HelperMacros.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;cppunit/Ui/Text/TestRunner.h&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 class TestOne : public CppUnit::TestCase {&lt;br /&gt;
 public:&lt;br /&gt;
 	CPPUNIT_TEST_SUITE (TestOne);&lt;br /&gt;
 	CPPUNIT_TEST_SUITE_END();&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 int main ()&lt;br /&gt;
 {&lt;br /&gt;
 	CppUnit::TextUi::TestRunner runner;&lt;br /&gt;
 &lt;br /&gt;
 	runner.run(&amp;quot;&amp;quot;, false);&lt;br /&gt;
 &lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
다시 궁리모드 돌입.&lt;br /&gt;
 1&lt;br /&gt;
 1 1 1 1&lt;br /&gt;
 1&lt;br /&gt;
 1 &lt;br /&gt;
 1&lt;br /&gt;
에서 테스트 코드에선 인풋 파싱은 일단 미리 생각할 필요가 없으니.&lt;br /&gt;
 configuration 1,1 로 셋팅&lt;br /&gt;
 1-&amp;amp;gt;1 로 1명 가기&lt;br /&gt;
 이럴 때, traffic 을 구하면 1명이 나온다.&lt;br /&gt;
&lt;br /&gt;
헉. 30분동안 프린트 하신다고 자리필요하신 분 때문에 지연. -_-; 다시 시작;&lt;br /&gt;
&lt;br /&gt;
 class TestOne : public CppUnit::TestCase {&lt;br /&gt;
 public:&lt;br /&gt;
 	CPPUNIT_TEST_SUITE (TestOne);&lt;br /&gt;
 	CPPUNIT_TEST (test1);&lt;br /&gt;
 	CPPUNIT_TEST_SUITE_END();&lt;br /&gt;
 &lt;br /&gt;
 	void test1 () {&lt;br /&gt;
 		Configuration* conf = new Configuration (1,1);&lt;br /&gt;
 		conf-&amp;amp;gt;movePeople (1,1,1);&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL (1, conf-&amp;amp;gt;getTraffic ());&lt;br /&gt;
 	}&lt;br /&gt;
 };&lt;br /&gt;
이에 대한 코드 작성&lt;br /&gt;
 class Configuration {&lt;br /&gt;
 	int startCity;&lt;br /&gt;
 	int endCity;&lt;br /&gt;
 public:&lt;br /&gt;
 	Configuration (int startCity, int endCity) {&lt;br /&gt;
 		this-&amp;amp;gt;startCity = startCity;&lt;br /&gt;
 		this-&amp;amp;gt;endCity = endCity;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	void movePeople (int startCity, int endCity, int people) {&lt;br /&gt;
 		&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	int getTraffic () {&lt;br /&gt;
 		return 1;&lt;br /&gt;
 	}&lt;br /&gt;
 };&lt;br /&gt;
 	void test1 () {&lt;br /&gt;
 		Configuration* conf = new Configuration (1,1);&lt;br /&gt;
 		conf-&amp;amp;gt;movePeople(1,1,1);&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL (1, conf-&amp;amp;gt;getTraffic ());&lt;br /&gt;
 		conf-&amp;amp;gt;movePeople(1,1,1);&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL (2, conf-&amp;amp;gt;getTraffic ());&lt;br /&gt;
 	}&lt;br /&gt;
 	void movePeople (int startCity, int endCity, int people) {&lt;br /&gt;
 		traffic += people;		&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	int getTraffic () {&lt;br /&gt;
 		return traffic;		&lt;br /&gt;
 	}&lt;br /&gt;
 		conf-&amp;amp;gt;movePeople(1,1,100);&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL (102, conf-&amp;amp;gt;getTraffic ());&lt;br /&gt;
여기까진 통과..~ test code 를 Refactoring 해봅니다.&lt;br /&gt;
 	void testOneToOneMove () {&lt;br /&gt;
 		int dataset [3][3] = {{1,1,1}, {1,1,1}, {1,1,100}};&lt;br /&gt;
 		int expectedSet[3] = {1,2,102};&lt;br /&gt;
 &lt;br /&gt;
 		Configuration* conf = new Configuration (1,1);&lt;br /&gt;
 &lt;br /&gt;
 		for (int i=0;i&amp;amp;lt;3;i++) {&lt;br /&gt;
 			conf-&amp;amp;gt;movePeople(dataset[i][0],dataset[i][1],dataset[i][2]);&lt;br /&gt;
 			CPPUNIT_ASSERT_EQUAL (expectedSet[i], conf-&amp;amp;gt;getTraffic ());&lt;br /&gt;
 		}&lt;br /&gt;
 		delete conf;&lt;br /&gt;
 	}&lt;br /&gt;
통과한 테스트&lt;br /&gt;
 configuration 1,1 로 셋팅&lt;br /&gt;
 1-&amp;amp;gt;1 로 1명 가기 : traffic 1.&lt;br /&gt;
 1-&amp;amp;gt;1 로 1명 더 가기 : traffic 2.&lt;br /&gt;
 1-&amp;amp;gt;1 로 100명 더 가기 : traffic 102.&lt;br /&gt;
다음 테스트의 생각&lt;br /&gt;
 configuration {1,2},{1,2} 로 셋팅&lt;br /&gt;
 1-&amp;amp;gt;2 로 1명 가기 : traffic 2.&lt;br /&gt;
 	void testOneToTwoMove () {&lt;br /&gt;
 		int arrivalCitys[] = {1,2};&lt;br /&gt;
 		int departureCitys[] = {1,2};&lt;br /&gt;
 &lt;br /&gt;
 		Configuration* conf = new Configuration (arrivalCitys, departureCitys);&lt;br /&gt;
 		&lt;br /&gt;
 		conf-&amp;amp;gt;movePeople(1,2,1);&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL(2, conf-&amp;amp;gt;getTraffic());&lt;br /&gt;
 &lt;br /&gt;
 		delete conf;&lt;br /&gt;
 	}&lt;br /&gt;
에러가 난다. C++ 에서는 터플이 없으므로.. -_- 배열을 넘기는 방법이 있고, vector 를 이용하는 방법이 있습니다. 저번에는 배열로 했기 때문에 이번엔 vector 로 해본다는. ^^;&lt;br /&gt;
 	void testOneToTwoMove () {&lt;br /&gt;
 		vector &amp;amp;lt;int&amp;amp;gt; arrivalCitys;&lt;br /&gt;
 		vector &amp;amp;lt;int&amp;amp;gt; departureCitys;&lt;br /&gt;
 	&lt;br /&gt;
 		arrivalCitys.push_back(1);&lt;br /&gt;
 		arrivalCitys.push_back(2);&lt;br /&gt;
 		departureCitys.push_back(1);&lt;br /&gt;
 		departureCitys.push_back(2);&lt;br /&gt;
 &lt;br /&gt;
 		Configuration* conf = new Configuration (arrivalCitys, departureCitys);&lt;br /&gt;
 		&lt;br /&gt;
 		conf-&amp;amp;gt;movePeople(1,2,1);&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL(2, conf-&amp;amp;gt;getTraffic());&lt;br /&gt;
 &lt;br /&gt;
 		delete conf;&lt;br /&gt;
 	}&lt;br /&gt;
컴파일 에러.  &lt;br /&gt;
 --------------------Configuration: AirportSec - Win32 Debug--------------------&lt;br /&gt;
 Compiling...&lt;br /&gt;
 main.cpp&lt;br /&gt;
 C:\User\reset\AirportSec\main.cpp(57) : error C2664: &amp;#039;__thiscall Configuration::Configuration(int,int)&amp;#039; : cannot convert parameter 1 from &amp;#039;class std::vector&amp;amp;lt;int,class std::allocator&amp;amp;lt;int&amp;amp;gt; &amp;amp;gt;&amp;#039; to &amp;#039;int&amp;#039;&lt;br /&gt;
         No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called&lt;br /&gt;
 Error executing cl.exe.&lt;br /&gt;
 &lt;br /&gt;
 AirportSec.exe - 1 error(s), 0 warning(s)&lt;br /&gt;
역시, 메인 코드도 수정 필요를 알려준다.&lt;br /&gt;
 	Configuration (vector&amp;amp;lt;int&amp;amp;gt; startCity, vector&amp;amp;lt;int&amp;amp;gt; endCity) {&lt;br /&gt;
 		this-&amp;amp;gt;startCity = startCity;&lt;br /&gt;
 		this-&amp;amp;gt;endCity = endCity;&lt;br /&gt;
 		this-&amp;amp;gt;traffic = 0;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	void movePeople (int startCity, int endCity, int people) {&lt;br /&gt;
 		traffic += people;		&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	int getTraffic () {&lt;br /&gt;
 		return traffic;		&lt;br /&gt;
 	}&lt;br /&gt;
이 경우 testOneToOneMove 가 깨지게 된다. 데이터형이 다르기 때문이다. testOneToOneMove 쪽 테스트 형을 똑같이 작성해준다.&lt;br /&gt;
 	void testOneToOneMove () {&lt;br /&gt;
 		int dataset [3][3] = {{1,1,1}, {1,1,1}, {1,1,100}};&lt;br /&gt;
 		int expectedSet[3] = {1,2,102};&lt;br /&gt;
 &lt;br /&gt;
 		vector&amp;amp;lt;int&amp;amp;gt; arrivalCitys;&lt;br /&gt;
 		vector&amp;amp;lt;int&amp;amp;gt; depatureCitys;&lt;br /&gt;
 &lt;br /&gt;
 		arrivalCitys.push_back(1);&lt;br /&gt;
 		depatureCitys.push_back(1);&lt;br /&gt;
 &lt;br /&gt;
 		Configuration* conf = new Configuration (arrivalCitys,depatureCitys);&lt;br /&gt;
결과 :&lt;br /&gt;
&lt;br /&gt;
 1) test: TestOne::testOneToTwoMove (F) line: 66 C:\User\reset\AirportSec\main.c&lt;br /&gt;
 p&lt;br /&gt;
 equality assertion failed&lt;br /&gt;
 - Expected: 2&lt;br /&gt;
 - Actual  : 1&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Press any key to continue&lt;br /&gt;
뒤의 테스트가 깨진다.&lt;br /&gt;
&lt;br /&gt;
movePeople 의 재정의.&lt;br /&gt;
 	void movePeople (int startCity, int endCity, int people) {&lt;br /&gt;
 		traffic += getDistance () * people;		&lt;br /&gt;
 	}&lt;br /&gt;
6:46 밥먹으러 감;&lt;br /&gt;
&lt;br /&gt;
7:50 다시 시작 예정. ^^; &lt;br /&gt;
----&lt;br /&gt;
getDistance ()의 경우 두 city gate 간의 거리이다. 일단 스텁 코드를 작성해두고,&lt;br /&gt;
 	int getDistance () {&lt;br /&gt;
 		return 0;&lt;br /&gt;
 	}&lt;br /&gt;
다음과 같이 테스트를 다시 작성할 수 있다.&lt;br /&gt;
 	void testGetDistance () {&lt;br /&gt;
 		vector &amp;amp;lt;int&amp;amp;gt; arrivalCitys;&lt;br /&gt;
 		vector &amp;amp;lt;int&amp;amp;gt; departureCitys;&lt;br /&gt;
 	&lt;br /&gt;
 		arrivalCitys.push_back(1);&lt;br /&gt;
 		departureCitys.push_back(1);&lt;br /&gt;
 &lt;br /&gt;
 		Configuration* conf = new Configuration (arrivalCitys, departureCitys);&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL(1, conf-&amp;amp;gt;getDistance(1,1));&lt;br /&gt;
 	}&lt;br /&gt;
 -------------------Configuration: AirportSec - Win32 Debug--------------------&lt;br /&gt;
 Compiling...&lt;br /&gt;
 main.cpp&lt;br /&gt;
 C:\User\reset\AirportSec\main.cpp(84) : error C2660: &amp;#039;getDistance&amp;#039; : function does not take 2 parameters&lt;br /&gt;
 Error executing cl.exe.&lt;br /&gt;
 &lt;br /&gt;
 AirportSec.exe - 1 error(s), 0 warning(s)&lt;br /&gt;
컴파일러가 인자 2개짜리 Interface 이기를 요청한다. 요청대로 해주자.&lt;br /&gt;
 	int getDistance (int startCity, int endCity) {&lt;br /&gt;
 		return 0;&lt;br /&gt;
 	}&lt;br /&gt;
&lt;br /&gt;
그에 따라 다음과 같은 에러가 난다. &lt;br /&gt;
 --------------------Configuration: AirportSec - Win32 Debug--------------------&lt;br /&gt;
 Compiling...&lt;br /&gt;
 main.cpp&lt;br /&gt;
 C:\User\reset\AirportSec\main.cpp(24) : error C2660: &amp;#039;getDistance&amp;#039; : function does not take 0 parameters&lt;br /&gt;
 Error executing cl.exe.&lt;br /&gt;
 &lt;br /&gt;
 AirportSec.exe - 1 error(s), 0 warning(s)&lt;br /&gt;
24 라인은 movePeople.&lt;br /&gt;
 	void movePeople (int startCity, int endCity, int people) {&lt;br /&gt;
 		traffic += getDistance () * people;		&lt;br /&gt;
 	}&lt;br /&gt;
이 인터페이스도 수정하길 컴파일러가 바라고 있다. 원하는대로 해주자.&lt;br /&gt;
 	void movePeople (int startCity, int endCity, int people) {&lt;br /&gt;
 		traffic += getDistance (startCity, endCity) * people;		&lt;br /&gt;
 	}&lt;br /&gt;
 1) test: TestOne::testOneToOneMove (F) line: 54 C:\User\reset\AirportSec\main.cpp equality assertion failed&lt;br /&gt;
 - Expected: 1&lt;br /&gt;
 - Actual  : 0&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 2) test: TestOne::testOneToTwoMove (F) line: 71 C:\User\reset\AirportSec\main.cpp equality assertion failed&lt;br /&gt;
 - Expected: 2&lt;br /&gt;
 - Actual  : 0&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 3) test: TestOne::testGetDistance (F) line: 84 C:\User\reset\AirportSec\main.cpp equality assertion failed&lt;br /&gt;
 - Expected: 1&lt;br /&gt;
 - Actual  : 0&lt;br /&gt;
기존의 테스트들이 전부 깨졌다. 기존의 테스트는 getTraffic 와 관련한 부분이고, 우리가 수정한 부분은 getDistance 이다. getDistance 에 촛점을 맞추자.&lt;br /&gt;
 	int getDistance (int startCity, int endCity) {&lt;br /&gt;
 		return 0;&lt;br /&gt;
 	}&lt;br /&gt;
일단은 다음과 같이. 촛점을 맞춰야 할 부분은 testGetDistance.&lt;br /&gt;
 	int getDistance (int startCity, int endCity) {&lt;br /&gt;
 		return 1;&lt;br /&gt;
 	}&lt;br /&gt;
 	void testGetDistance2() {&lt;br /&gt;
 		vector &amp;amp;lt;int&amp;amp;gt; arrivalCitys;&lt;br /&gt;
 		vector &amp;amp;lt;int&amp;amp;gt; departureCitys;&lt;br /&gt;
 	&lt;br /&gt;
 		arrivalCitys.push_back(1);&lt;br /&gt;
 		arrivalCitys.push_back(2);&lt;br /&gt;
 		departureCitys.push_back(1);&lt;br /&gt;
 		departureCitys.push_back(2);&lt;br /&gt;
 &lt;br /&gt;
 		Configuration* conf = new Configuration (arrivalCitys, departureCitys);&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL(2, conf-&amp;amp;gt;getDistance(1,2));&lt;br /&gt;
 		delete conf;&lt;br /&gt;
 	}&lt;br /&gt;
getDistance 에 대해 refinement 해주자.&lt;br /&gt;
 	int getDistance (int startCity, int endCity) {&lt;br /&gt;
 		return abs (getStartGateIndex(startCity) - getEndGateIndex(endCity)) + 1;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	int getStartGateIndex (int startCity) {&lt;br /&gt;
 		for (int cityIndex=0; cityIndex &amp;amp;lt; this-&amp;amp;gt;startCity.size(); cityIndex++) {&lt;br /&gt;
 			if (this-&amp;amp;gt;startCity[cityIndex] == startCity) {&lt;br /&gt;
 				return cityIndex;&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
 		return -1;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	int getEndGateIndex (int endCity) {&lt;br /&gt;
 		for (int cityIndex=0; cityIndex &amp;amp;lt; this-&amp;amp;gt;endCity.size(); cityIndex++) {&lt;br /&gt;
 			if (this-&amp;amp;gt;endCity[cityIndex] == endCity) {&lt;br /&gt;
 				return cityIndex;&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
 		return -1;&lt;br /&gt;
 	}&lt;br /&gt;
여기서 Test - Code 의 시간이 꽤 길었다. (9분) 함수 refinement 부분에서 STL 에 있는 find 함수를 함 써먹어 보려고 했다가;; 결국은 평소 하던데로 했다. ^^;&lt;br /&gt;
&lt;br /&gt;
Refactoring - 중복없애기.&lt;br /&gt;
 	int find (vector&amp;amp;lt;int&amp;amp;gt;&amp;amp;amp; cities, int city) {&lt;br /&gt;
 		for (int cityIndex=0; cityIndex &amp;amp;lt; cities.size(); cityIndex++) {&lt;br /&gt;
 			if (cities[cityIndex] == city) {&lt;br /&gt;
 				return cityIndex;&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
 		return -1;&lt;br /&gt;
 	}&lt;br /&gt;
여기서 지금까지 생각한 test 들을 전부 pass 했다. 앞으로 더 해야 할 일이 생각나지 않아서, 한번 실제 메인테스트에 준하는 테스트를 해 보았다. 즉,&lt;br /&gt;
 2 &lt;br /&gt;
 1 1 2 100 &lt;br /&gt;
 2 1 1 200&lt;br /&gt;
 1 &lt;br /&gt;
 1 2 &lt;br /&gt;
 1 2 &lt;br /&gt;
 0 &lt;br /&gt;
 0 &lt;br /&gt;
에 대해서 traffic 이 600 이 나오는 것을 확인하는 테스트.&lt;br /&gt;
 	void testRealOne () {&lt;br /&gt;
 		vector&amp;amp;lt;int&amp;amp;gt; arrivalCitys;&lt;br /&gt;
 		vector&amp;amp;lt;int&amp;amp;gt; departureCitys;&lt;br /&gt;
 &lt;br /&gt;
 		arrivalCitys.push_back(1);&lt;br /&gt;
 		arrivalCitys.push_back(2);&lt;br /&gt;
 		departureCitys.push_back(1);&lt;br /&gt;
 		departureCitys.push_back(2);&lt;br /&gt;
 &lt;br /&gt;
 		Configuration* conf = new Configuration (arrivalCitys, departureCitys);&lt;br /&gt;
 		conf-&amp;amp;gt;movePeople(1,2, 100);&lt;br /&gt;
 		conf-&amp;amp;gt;movePeople(2,1, 200);&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL(600, conf-&amp;amp;gt;getTraffic());&lt;br /&gt;
 		delete conf;&lt;br /&gt;
 	}&lt;br /&gt;
결과 : ok. Configuration은 실질적인 데이터까지도 트레픽을 계산할 수 있는 수준까지 되었다. 테스트를 좀 더 붙여보자. 좀 더 어려운 경우인 앞단계의 데이터에 대해 해보자.&lt;br /&gt;
 1 2 2 10 3 15&lt;br /&gt;
 2 1 3 10&lt;br /&gt;
 3 2 1 12 2 20&lt;br /&gt;
 1&lt;br /&gt;
 1 2 3&lt;br /&gt;
 2 3 1&lt;br /&gt;
 0&lt;br /&gt;
 0&lt;br /&gt;
일때 traffic 122 가 나와야 한다.&lt;br /&gt;
 	void testRealTwo () {&lt;br /&gt;
 		vector&amp;amp;lt;int&amp;amp;gt; arrivalCitys;&lt;br /&gt;
 		vector&amp;amp;lt;int&amp;amp;gt; departureCitys;&lt;br /&gt;
 &lt;br /&gt;
 		arrivalCitys.push_back(1);&lt;br /&gt;
 		arrivalCitys.push_back(2);&lt;br /&gt;
 		arrivalCitys.push_back(3);&lt;br /&gt;
 		departureCitys.push_back(2);&lt;br /&gt;
 		departureCitys.push_back(3);&lt;br /&gt;
 		departureCitys.push_back(1);&lt;br /&gt;
 &lt;br /&gt;
 		Configuration* conf = new Configuration (arrivalCitys, departureCitys);&lt;br /&gt;
 		conf-&amp;amp;gt;movePeople(1,2,10);&lt;br /&gt;
 		conf-&amp;amp;gt;movePeople(1,3,15);&lt;br /&gt;
 		conf-&amp;amp;gt;movePeople(2,3,10);&lt;br /&gt;
 		conf-&amp;amp;gt;movePeople(3,1,12);&lt;br /&gt;
 		conf-&amp;amp;gt;movePeople(3,2,20);&lt;br /&gt;
 &lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL(122, conf-&amp;amp;gt;getTraffic());&lt;br /&gt;
 		delete conf;&lt;br /&gt;
 	}&lt;br /&gt;
pass 되었다. 아무래도 한번 미리 짜본 프로그램이여서 그런지 초반에 일반화된 것이 아닐까 하는 생각이 든다.&lt;br /&gt;
&lt;br /&gt;
Refactoring 하기 전 현재 소스.&lt;br /&gt;
 #include &amp;amp;lt;cppunit/TestCase.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;cppunit/extensions/HelperMacros.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;cppunit/Ui/Text/TestRunner.h&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;amp;lt;vector&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;algorithm&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 using namespace std;&lt;br /&gt;
 &lt;br /&gt;
 class Configuration {&lt;br /&gt;
 	vector&amp;amp;lt;int&amp;amp;gt; startCity;&lt;br /&gt;
 	vector&amp;amp;lt;int&amp;amp;gt; endCity;&lt;br /&gt;
 	int traffic;&lt;br /&gt;
 public:&lt;br /&gt;
 	Configuration (vector&amp;amp;lt;int&amp;amp;gt; startCity, vector&amp;amp;lt;int&amp;amp;gt; endCity) {&lt;br /&gt;
 		this-&amp;amp;gt;startCity = startCity;&lt;br /&gt;
 		this-&amp;amp;gt;endCity = endCity;&lt;br /&gt;
 		this-&amp;amp;gt;traffic = 0;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	int find (vector&amp;amp;lt;int&amp;amp;gt;&amp;amp;amp; cities, int city) {&lt;br /&gt;
 		for (int cityIndex=0; cityIndex &amp;amp;lt; cities.size(); cityIndex++) {&lt;br /&gt;
 			if (cities[cityIndex] == city) {&lt;br /&gt;
 				return cityIndex;&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
 		return -1;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	int getStartGateIndex (int startCity) {&lt;br /&gt;
 		return find (this-&amp;amp;gt;startCity, startCity);&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	int getEndGateIndex (int endCity) {&lt;br /&gt;
 		return find (this-&amp;amp;gt;endCity, endCity);&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 	int getDistance (int startCity, int endCity) {&lt;br /&gt;
 		return abs (getStartGateIndex(startCity) - getEndGateIndex(endCity)) + 1;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	void movePeople (int startCity, int endCity, int people) {&lt;br /&gt;
 		this-&amp;amp;gt;traffic += getDistance (startCity, endCity) * people;		&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	int getTraffic () {&lt;br /&gt;
 		return this-&amp;amp;gt;traffic;		&lt;br /&gt;
 	}&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 class TestOne : public CppUnit::TestCase {&lt;br /&gt;
 public:&lt;br /&gt;
 	CPPUNIT_TEST_SUITE (TestOne);&lt;br /&gt;
 	CPPUNIT_TEST (testOneToOneMove);&lt;br /&gt;
 	CPPUNIT_TEST (testOneToTwoMove);&lt;br /&gt;
 	CPPUNIT_TEST (testGetDistance);&lt;br /&gt;
 	CPPUNIT_TEST (testGetDistance2);&lt;br /&gt;
 	CPPUNIT_TEST (testRealOne);&lt;br /&gt;
 	CPPUNIT_TEST (testRealTwo);&lt;br /&gt;
 &lt;br /&gt;
 	CPPUNIT_TEST_SUITE_END();&lt;br /&gt;
 &lt;br /&gt;
 	void testOneToOneMove () {&lt;br /&gt;
 		int dataset [3][3] = {{1,1,1}, {1,1,1}, {1,1,100}};&lt;br /&gt;
 		int expectedSet[3] = {1,2,102};&lt;br /&gt;
 &lt;br /&gt;
 		vector&amp;amp;lt;int&amp;amp;gt; arrivalCitys;&lt;br /&gt;
 		vector&amp;amp;lt;int&amp;amp;gt; depatureCitys;&lt;br /&gt;
 &lt;br /&gt;
 		arrivalCitys.push_back(1);&lt;br /&gt;
 		depatureCitys.push_back(1);&lt;br /&gt;
 &lt;br /&gt;
 		Configuration* conf = new Configuration (arrivalCitys,depatureCitys);&lt;br /&gt;
 &lt;br /&gt;
 		for (int i=0;i&amp;amp;lt;3;i++) {&lt;br /&gt;
 			conf-&amp;amp;gt;movePeople(dataset[i][0],dataset[i][1],dataset[i][2]);&lt;br /&gt;
 			CPPUNIT_ASSERT_EQUAL (expectedSet[i], conf-&amp;amp;gt;getTraffic ());&lt;br /&gt;
 		}&lt;br /&gt;
 		delete conf;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	void testOneToTwoMove () {&lt;br /&gt;
 		vector &amp;amp;lt;int&amp;amp;gt; arrivalCitys;&lt;br /&gt;
 		vector &amp;amp;lt;int&amp;amp;gt; departureCitys;&lt;br /&gt;
 	&lt;br /&gt;
 		arrivalCitys.push_back(1);&lt;br /&gt;
 		arrivalCitys.push_back(2);&lt;br /&gt;
 		departureCitys.push_back(1);&lt;br /&gt;
 		departureCitys.push_back(2);&lt;br /&gt;
 &lt;br /&gt;
 		Configuration* conf = new Configuration (arrivalCitys, departureCitys);&lt;br /&gt;
 		&lt;br /&gt;
 		conf-&amp;amp;gt;movePeople(1,2,1);&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL(2, conf-&amp;amp;gt;getTraffic());&lt;br /&gt;
 &lt;br /&gt;
 		delete conf;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	void testGetDistance () {&lt;br /&gt;
 		vector &amp;amp;lt;int&amp;amp;gt; arrivalCitys;&lt;br /&gt;
 		vector &amp;amp;lt;int&amp;amp;gt; departureCitys;&lt;br /&gt;
 	&lt;br /&gt;
 		arrivalCitys.push_back(1);&lt;br /&gt;
 		departureCitys.push_back(1);&lt;br /&gt;
 &lt;br /&gt;
 		Configuration* conf = new Configuration (arrivalCitys, departureCitys);&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL(1, conf-&amp;amp;gt;getDistance(1,1));&lt;br /&gt;
 		delete conf;&lt;br /&gt;
 	}&lt;br /&gt;
 	void testGetDistance2() {&lt;br /&gt;
 		vector &amp;amp;lt;int&amp;amp;gt; arrivalCitys;&lt;br /&gt;
 		vector &amp;amp;lt;int&amp;amp;gt; departureCitys;&lt;br /&gt;
 	&lt;br /&gt;
 		arrivalCitys.push_back(1);&lt;br /&gt;
 		arrivalCitys.push_back(2);&lt;br /&gt;
 		departureCitys.push_back(1);&lt;br /&gt;
 		departureCitys.push_back(2);&lt;br /&gt;
 &lt;br /&gt;
 		Configuration* conf = new Configuration (arrivalCitys, departureCitys);&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL(2, conf-&amp;amp;gt;getDistance(1,2));&lt;br /&gt;
 		delete conf;&lt;br /&gt;
 	}&lt;br /&gt;
 	void testRealOne () {&lt;br /&gt;
 		vector&amp;amp;lt;int&amp;amp;gt; arrivalCitys;&lt;br /&gt;
 		vector&amp;amp;lt;int&amp;amp;gt; departureCitys;&lt;br /&gt;
 &lt;br /&gt;
 		arrivalCitys.push_back(1);&lt;br /&gt;
 		arrivalCitys.push_back(2);&lt;br /&gt;
 		departureCitys.push_back(1);&lt;br /&gt;
 		departureCitys.push_back(2);&lt;br /&gt;
 &lt;br /&gt;
 		Configuration* conf = new Configuration (arrivalCitys, departureCitys);&lt;br /&gt;
 		conf-&amp;amp;gt;movePeople(1,2, 100);&lt;br /&gt;
 		conf-&amp;amp;gt;movePeople(2,1, 200);&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL(600, conf-&amp;amp;gt;getTraffic());&lt;br /&gt;
 		delete conf;&lt;br /&gt;
 	}&lt;br /&gt;
 	void testRealTwo () {&lt;br /&gt;
 		vector&amp;amp;lt;int&amp;amp;gt; arrivalCitys;&lt;br /&gt;
 		vector&amp;amp;lt;int&amp;amp;gt; departureCitys;&lt;br /&gt;
 &lt;br /&gt;
 		arrivalCitys.push_back(1);&lt;br /&gt;
 		arrivalCitys.push_back(2);&lt;br /&gt;
 		arrivalCitys.push_back(3);&lt;br /&gt;
 		departureCitys.push_back(2);&lt;br /&gt;
 		departureCitys.push_back(3);&lt;br /&gt;
 		departureCitys.push_back(1);&lt;br /&gt;
 &lt;br /&gt;
 		Configuration* conf = new Configuration (arrivalCitys, departureCitys);&lt;br /&gt;
 		conf-&amp;amp;gt;movePeople(1,2,10);&lt;br /&gt;
 		conf-&amp;amp;gt;movePeople(1,3,15);&lt;br /&gt;
 		conf-&amp;amp;gt;movePeople(2,3,10);&lt;br /&gt;
 		conf-&amp;amp;gt;movePeople(3,1,12);&lt;br /&gt;
 		conf-&amp;amp;gt;movePeople(3,2,20);&lt;br /&gt;
 &lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL(122, conf-&amp;amp;gt;getTraffic());&lt;br /&gt;
 		delete conf;&lt;br /&gt;
 	}&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 int main ()&lt;br /&gt;
 {&lt;br /&gt;
 	CppUnit::TextUi::TestRunner runner;&lt;br /&gt;
 &lt;br /&gt;
 	runner.addTest (TestOne::suite());&lt;br /&gt;
 	runner.run(&amp;quot;&amp;quot;, false);&lt;br /&gt;
 &lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
테스트 코딩 Refactoring - 으.. 여전히 시간이 많이 걸린다. 주로 중복을 없애는 방향으로 접근.&lt;br /&gt;
 #ifndef _CONFIGURATION_H_&lt;br /&gt;
 #define _CONFIGURATION_H_&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;amp;lt;vector&amp;amp;gt;&lt;br /&gt;
 using namespace std;&lt;br /&gt;
 &lt;br /&gt;
 class Configuration {&lt;br /&gt;
 	vector&amp;amp;lt;int&amp;amp;gt; startCity;&lt;br /&gt;
 	vector&amp;amp;lt;int&amp;amp;gt; endCity;&lt;br /&gt;
 	int traffic;&lt;br /&gt;
 public:&lt;br /&gt;
 	Configuration (vector&amp;amp;lt;int&amp;amp;gt; startCity, vector&amp;amp;lt;int&amp;amp;gt; endCity) {&lt;br /&gt;
 		this-&amp;amp;gt;startCity = startCity;&lt;br /&gt;
 		this-&amp;amp;gt;endCity = endCity;&lt;br /&gt;
 		this-&amp;amp;gt;traffic = 0;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	int find (vector&amp;amp;lt;int&amp;amp;gt;&amp;amp;amp; cities, int city) {&lt;br /&gt;
 		for (int cityIndex=0; cityIndex &amp;amp;lt; cities.size(); cityIndex++) {&lt;br /&gt;
 			if (cities[cityIndex] == city) {&lt;br /&gt;
 				return cityIndex;&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
 		return -1;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	int getStartGateIndex (int startCity) {&lt;br /&gt;
 		return find (this-&amp;amp;gt;startCity, startCity);&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	int getEndGateIndex (int endCity) {&lt;br /&gt;
 		return find (this-&amp;amp;gt;endCity, endCity);&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 	int getDistance (int startCity, int endCity) {&lt;br /&gt;
 		return abs (getStartGateIndex(startCity) - getEndGateIndex(endCity)) + 1;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	void movePeople (int startCity, int endCity, int people) {&lt;br /&gt;
 		this-&amp;amp;gt;traffic += getDistance (startCity, endCity) * people;		&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	int getTraffic () {&lt;br /&gt;
 		return this-&amp;amp;gt;traffic;		&lt;br /&gt;
 	}&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 #endif&lt;br /&gt;
history 를 보니 30분정도 걸렸군요. 흠..&lt;br /&gt;
&lt;br /&gt;
그러다가 보니, 테스트 코드에서 자주 중복이 나타나는 부분이 눈에 띤다.&lt;br /&gt;
 		int arrivalData[] = {1,2};&lt;br /&gt;
 		int departureData[] = {1,2};&lt;br /&gt;
 		conf = new Configuration (arrivalCitys, departureCitys);&lt;br /&gt;
식으로 설정되는 Configuration 부분. &lt;br /&gt;
&lt;br /&gt;
setUp 부분 묶어서 Configuration 에 대한 테스트를 두개로 묶기로 했다.&lt;br /&gt;
 #ifndef _TEST_CONFIGURATION_H_&lt;br /&gt;
 #define _TEST_CONFIGURATION_H_&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;amp;lt;cppunit/TestCase.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;cppunit/extensions/HelperMacros.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;vector&amp;amp;gt;&lt;br /&gt;
 using namespace std;&lt;br /&gt;
 &lt;br /&gt;
 void intVectorInit (vector&amp;amp;lt;int&amp;amp;gt;&amp;amp;amp; vec, int* intList, int count) {&lt;br /&gt;
 	for (int i=0;i&amp;amp;lt;count;i++) {&lt;br /&gt;
 		vec.push_back(intList[i]);&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void movePeople (Configuration* conf, int moveDataSet[][3], int moveCount) {&lt;br /&gt;
 	for (int i=0;i&amp;amp;lt;moveCount;i++) {&lt;br /&gt;
 		conf-&amp;amp;gt;movePeople(moveDataSet[i][0], moveDataSet[i][1], moveDataSet[i][2]);&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class TestConfigurationBasic : public CppUnit::TestCase {&lt;br /&gt;
 	CPPUNIT_TEST_SUITE (TestConfigurationBasic);&lt;br /&gt;
 	CPPUNIT_TEST (testOneToOneMove);&lt;br /&gt;
 	CPPUNIT_TEST (testGetDistance);&lt;br /&gt;
 	CPPUNIT_TEST_SUITE_END();&lt;br /&gt;
 &lt;br /&gt;
 public:&lt;br /&gt;
 	Configuration* conf;&lt;br /&gt;
 	vector&amp;amp;lt;int&amp;amp;gt; arrivalCitys;&lt;br /&gt;
 	vector&amp;amp;lt;int&amp;amp;gt; departureCitys;&lt;br /&gt;
 &lt;br /&gt;
 	void setUp () {&lt;br /&gt;
 		conf = NULL;&lt;br /&gt;
 &lt;br /&gt;
 	}&lt;br /&gt;
 	void tearDown () {&lt;br /&gt;
 		if (conf) delete conf;&lt;br /&gt;
 		arrivalCitys.clear();&lt;br /&gt;
 		departureCitys.clear();&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	void testOneToOneMove () {&lt;br /&gt;
 		int moveDataSet [3][3] = {{1,1,1}, {1,1,1}, {1,1,100}};&lt;br /&gt;
 		int expectedSet[3] = {1,2,102};&lt;br /&gt;
 		&lt;br /&gt;
 		arrivalCitys.push_back(1);&lt;br /&gt;
 		departureCitys.push_back(1);&lt;br /&gt;
 		&lt;br /&gt;
 		conf = new Configuration (arrivalCitys,departureCitys);&lt;br /&gt;
 		&lt;br /&gt;
 		for (int i=0;i&amp;amp;lt;3;i++) {&lt;br /&gt;
 			conf-&amp;amp;gt;movePeople(moveDataSet[i][0],moveDataSet[i][1],moveDataSet[i][2]);&lt;br /&gt;
 			CPPUNIT_ASSERT_EQUAL (expectedSet[i], conf-&amp;amp;gt;getTraffic ());&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	void testGetDistance () {&lt;br /&gt;
 		vector &amp;amp;lt;int&amp;amp;gt; arrivalCitys;&lt;br /&gt;
 		vector &amp;amp;lt;int&amp;amp;gt; departureCitys;&lt;br /&gt;
 		&lt;br /&gt;
 		arrivalCitys.push_back(1);&lt;br /&gt;
 		departureCitys.push_back(1);&lt;br /&gt;
 		&lt;br /&gt;
 		conf = new Configuration (arrivalCitys, departureCitys);&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL(1, conf-&amp;amp;gt;getDistance(1,1));&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 class TestConfigurationCityTwo : public CppUnit::TestCase {&lt;br /&gt;
 	CPPUNIT_TEST_SUITE (TestConfigurationCityTwo);&lt;br /&gt;
 	CPPUNIT_TEST (testOneToTwoMove);&lt;br /&gt;
 	CPPUNIT_TEST (testGetDistance2);&lt;br /&gt;
 	CPPUNIT_TEST (testRealOne);&lt;br /&gt;
 	&lt;br /&gt;
 	CPPUNIT_TEST_SUITE_END();&lt;br /&gt;
 	&lt;br /&gt;
 public:&lt;br /&gt;
 	Configuration* conf;&lt;br /&gt;
 	vector&amp;amp;lt;int&amp;amp;gt; arrivalCitys;&lt;br /&gt;
 	vector&amp;amp;lt;int&amp;amp;gt; departureCitys;&lt;br /&gt;
 	&lt;br /&gt;
 	void setUp () {&lt;br /&gt;
 		conf = NULL;&lt;br /&gt;
 		int arrivalData[] = {1,2};&lt;br /&gt;
 		int departureData[] = {1,2};&lt;br /&gt;
 		intVectorInit (arrivalCitys, arrivalData, 2);&lt;br /&gt;
 		intVectorInit (departureCitys, departureData, 2);&lt;br /&gt;
 &lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	void tearDown() {&lt;br /&gt;
 		if (conf) delete conf;&lt;br /&gt;
 		arrivalCitys.clear();&lt;br /&gt;
 		departureCitys.clear();&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	void testOneToTwoMove () {&lt;br /&gt;
 		conf = new Configuration (arrivalCitys, departureCitys);&lt;br /&gt;
 		conf-&amp;amp;gt;movePeople(1,2,1);&lt;br /&gt;
 		&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL(2, conf-&amp;amp;gt;getTraffic());&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	void testGetDistance2() {&lt;br /&gt;
 		conf = new Configuration (arrivalCitys, departureCitys);&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL(2, conf-&amp;amp;gt;getDistance(1,2));&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	void testRealOne () {&lt;br /&gt;
 		int moveDataSet[2][3] = {{1,2,100}, {2,1,200}};&lt;br /&gt;
 		&lt;br /&gt;
 		conf = new Configuration (arrivalCitys, departureCitys);&lt;br /&gt;
 		movePeople (conf, moveDataSet, 2);&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL(600, conf-&amp;amp;gt;getTraffic());&lt;br /&gt;
 	}&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 class TestConfigurationCityThree : public CppUnit::TestCase {&lt;br /&gt;
 	CPPUNIT_TEST_SUITE(TestConfigurationCityThree);&lt;br /&gt;
 	CPPUNIT_TEST (testRealTwo);&lt;br /&gt;
 	CPPUNIT_TEST_SUITE_END();&lt;br /&gt;
 	&lt;br /&gt;
 public:&lt;br /&gt;
 	Configuration* conf;&lt;br /&gt;
 	vector&amp;amp;lt;int&amp;amp;gt; arrivalCitys;&lt;br /&gt;
 	vector&amp;amp;lt;int&amp;amp;gt; departureCitys;&lt;br /&gt;
 &lt;br /&gt;
 	void setUp () {&lt;br /&gt;
 		conf = NULL;&lt;br /&gt;
 &lt;br /&gt;
 	}&lt;br /&gt;
 	void tearDown () {&lt;br /&gt;
 		if (conf) delete conf;&lt;br /&gt;
 		arrivalCitys.clear();&lt;br /&gt;
 		departureCitys.clear();&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	void testRealTwo () {&lt;br /&gt;
 		int arrivalData[] = {1,2,3};&lt;br /&gt;
 		int departureData[] = {2,3,1};&lt;br /&gt;
 		int moveDataSet[5][3] = {{1,2,10}, {1,3,15}, {2,3,10}, {3,1,12}, {3,2,20}};&lt;br /&gt;
 		&lt;br /&gt;
 		intVectorInit (arrivalCitys, arrivalData, 3);&lt;br /&gt;
 		intVectorInit (departureCitys, departureData, 3);&lt;br /&gt;
 		&lt;br /&gt;
 		conf = new Configuration (arrivalCitys, departureCitys);&lt;br /&gt;
 		movePeople (conf, moveDataSet, 5);&lt;br /&gt;
 		&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL(122, conf-&amp;amp;gt;getTraffic());&lt;br /&gt;
 	}&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 #endif&lt;br /&gt;
근데, Refactoring 에 대해서만 1시간을 쓴 것 같다. 그것도 메인 코드인 Configuration 클래스 보단, Test 코드에 대한 Refactoring 이 주가 된 것 같다. 실질적인 실용성을 볼때, 메인 코드에 대한 Refactoring 위주로 나가는 것이 좋을 것 같다. (깨진 Test 는 주로 삭제하는 스타일로 가고..)&lt;br /&gt;
&lt;br /&gt;
Configuration 하나에 대해서는 된 것 같고. 또 테스트 들어갈 것이 없을까... 생각하던중, 이제는 여러개의 데이터가 들어가야겠다는 생각을 하게 되었다. 즉, Configuration 이 2개인 경우에 대해서.&lt;br /&gt;
Configuration 이 2개인 경우에 대해서. 이 Configuration 을 가지고 있는 것을 Airport 라고 상정짓도록 하겠다. Airport 는 Configuration 을 등록할 수 있으며, 각각의 Configuration 경우에 대한 Traffic 들을 각 Configuration 에게 물어봄으로서 계산된 Traffic 들을 알 수 있다.&lt;br /&gt;
&lt;br /&gt;
간단한 두번째의 경우 예를 먼저 든다면.&lt;br /&gt;
 1 1 2 100&lt;br /&gt;
 2 1 1 200&lt;br /&gt;
 1&lt;br /&gt;
 1 2&lt;br /&gt;
 1 2&lt;br /&gt;
 2 &lt;br /&gt;
 1 2&lt;br /&gt;
 2 1&lt;br /&gt;
 0&lt;br /&gt;
 0&lt;br /&gt;
각 경우에 대해 첫번째 traffic 은 600이, 두번째 traffic 은 300 이 나와야 한다.&lt;br /&gt;
 class TestAirport : public CppUnit::TestCase {&lt;br /&gt;
 	CPPUNIT_TEST_SUITE (TestAirport);&lt;br /&gt;
 	CPPUNIT_TEST (testOne);&lt;br /&gt;
 	CPPUNIT_TEST_SUITE_END();&lt;br /&gt;
 &lt;br /&gt;
 public:&lt;br /&gt;
 	Configuration* conf1;&lt;br /&gt;
 	Configuration* conf2;&lt;br /&gt;
 	vector&amp;amp;lt;int&amp;amp;gt; arrivalCitys;&lt;br /&gt;
 	vector&amp;amp;lt;int&amp;amp;gt; departureCitys;&lt;br /&gt;
 	vector&amp;amp;lt;int&amp;amp;gt; arrivalCitys2;&lt;br /&gt;
 	vector&amp;amp;lt;int&amp;amp;gt; departureCitys2;&lt;br /&gt;
 &lt;br /&gt;
 	void setUp () {&lt;br /&gt;
 		int arrivalData[] = {1,2};&lt;br /&gt;
 		int departureData[] = {1,2};&lt;br /&gt;
 		intVectorInit (arrivalCitys, arrivalData, 2);&lt;br /&gt;
 		intVectorInit (departureCitys, departureData, 2);&lt;br /&gt;
 		conf1 = new Configuration (arrivalCitys, departureCitys);&lt;br /&gt;
 &lt;br /&gt;
 		int arrivalData2[] = {1,2};&lt;br /&gt;
 		int departureData2[] = {2,1};&lt;br /&gt;
 		intVectorInit (arrivalCitys2, arrivalData, 2);&lt;br /&gt;
 		intVectorInit (departureCitys2, departureData, 2);&lt;br /&gt;
 		conf2 = new Configuration (arrivalCitys2, departureCitys2);&lt;br /&gt;
 	}&lt;br /&gt;
 	void tearDown () {&lt;br /&gt;
 		delete conf1;&lt;br /&gt;
 		delete conf2;&lt;br /&gt;
 		arrivalCitys.clear();&lt;br /&gt;
 		departureCitys.clear();&lt;br /&gt;
 		arrivalCitys2.clear();&lt;br /&gt;
 		departureCitys2.clear();&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	void testOne () {&lt;br /&gt;
 		Airport* airport = new Airport();&lt;br /&gt;
 		airport-&amp;amp;gt;registerConfiguration (conf1);&lt;br /&gt;
 		airport-&amp;amp;gt;registerConfiguration (conf2);&lt;br /&gt;
 &lt;br /&gt;
 		airport-&amp;amp;gt;movePeople (1,2,100);&lt;br /&gt;
 		airport-&amp;amp;gt;movePeople (2,1,200);&lt;br /&gt;
 &lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL (600, airport-&amp;amp;gt;getTraffic(0));&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL (300, airport-&amp;amp;gt;getTraffic(1));&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
airport 관련 코드 구현.&lt;br /&gt;
 	void movePeople (int startCity, int endCity, int people) {&lt;br /&gt;
 		for (int i=0;i&amp;amp;lt; this-&amp;amp;gt;configurations.size();i++) {&lt;br /&gt;
 			this-&amp;amp;gt;configurations[i]-&amp;amp;gt;movePeople(startCity, endCity, people);&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
결과 :&lt;br /&gt;
 1) test: TestAirport::testOne (F) line: 72 c:\user\reset\airportsec\testairport.h equality assertion failed&lt;br /&gt;
 - Expected: 300&lt;br /&gt;
 - Actual  : 600&lt;br /&gt;
왜 두번째 configuration 의 경우에 대해서 에러일까? 다시 configuration 으로; 테스트를 더 추가해 보았다.&lt;br /&gt;
 	void testGetDistance2to1() {&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL(2, conf-&amp;amp;gt;getDistance(2,1));&lt;br /&gt;
 	}&lt;br /&gt;
멀쩡하다. 그래서, Configuration 에 대한 테스트를 더 작성하였다.&lt;br /&gt;
 	void testTwoToOneMove () {&lt;br /&gt;
 		int arrivalData[] = {1,2};&lt;br /&gt;
 		int departureData[] = {2,1};&lt;br /&gt;
 		intVectorInit (arrivalCitys, arrivalData, 2);&lt;br /&gt;
 		intVectorInit (departureCitys, departureData, 2);&lt;br /&gt;
 &lt;br /&gt;
 		conf = new Configuration (arrivalCitys, departureCitys);&lt;br /&gt;
 		conf-&amp;amp;gt;movePeople(1,2,100);&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL(100, conf-&amp;amp;gt;getTraffic());&lt;br /&gt;
 	}&lt;br /&gt;
 		conf-&amp;amp;gt;movePeople(2,1,200);&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL(300, conf-&amp;amp;gt;getTraffic());&lt;br /&gt;
작동을 잘 한다; 문제는 이제 Airport 쪽으로 축소되는 듯 하다.&lt;br /&gt;
 		int arrivalData2[] = {1,2};&lt;br /&gt;
 		int departureData2[] = {2,1};&lt;br /&gt;
 		intVectorInit (arrivalCitys2, arrivalData, 2);  // &amp;amp;lt;-- arrivalData2 로 초기화되어야 한다.&lt;br /&gt;
 		intVectorInit (departureCitys2, departureData, 2); // 역시 또한;&lt;br /&gt;
&lt;br /&gt;
 .........&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 OK (9 tests)&lt;br /&gt;
다른 테스트에 대해서도 해보자.&lt;br /&gt;
 	void testGetTraffics2 () {&lt;br /&gt;
 		int arrivalData[] = {1,2,3};&lt;br /&gt;
 		int departureData[] = {2,3,1};&lt;br /&gt;
 		intVectorInit (arrivalCitys, arrivalData, 3);&lt;br /&gt;
 		intVectorInit (departureCitys, departureData, 3);&lt;br /&gt;
 		conf1 = new Configuration (arrivalCitys, departureCitys);&lt;br /&gt;
 &lt;br /&gt;
 		int arrivalData2[] = {2,3,1};&lt;br /&gt;
 		int departureData2[] = {3,2,1};&lt;br /&gt;
 		intVectorInit (arrivalCitys2, arrivalData2, 3);&lt;br /&gt;
 		intVectorInit (departureCitys2, departureData2, 3);&lt;br /&gt;
 		conf2 = new Configuration (arrivalCitys2, departureCitys2);&lt;br /&gt;
 &lt;br /&gt;
 		Airport* airport = new Airport();&lt;br /&gt;
 		airport-&amp;amp;gt;registerConfiguration (conf1);&lt;br /&gt;
 		airport-&amp;amp;gt;registerConfiguration (conf2);&lt;br /&gt;
 &lt;br /&gt;
 		airport-&amp;amp;gt;movePeople (1,2,10);&lt;br /&gt;
 		airport-&amp;amp;gt;movePeople (1,3,15);&lt;br /&gt;
 		airport-&amp;amp;gt;movePeople (2,3,10);&lt;br /&gt;
 		airport-&amp;amp;gt;movePeople (3,1,12);&lt;br /&gt;
 		airport-&amp;amp;gt;movePeople (3,2,20);&lt;br /&gt;
 &lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL (122, airport-&amp;amp;gt;getTraffic(0));&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL (119, airport-&amp;amp;gt;getTraffic(1));&lt;br /&gt;
 &lt;br /&gt;
 		delete airport;&lt;br /&gt;
 	}&lt;br /&gt;
Sort 결과 테스트.&lt;br /&gt;
 	void testSortedResult () {&lt;br /&gt;
 		int arrivalData[] = {1,2,3};&lt;br /&gt;
 		int departureData[] = {2,3,1};&lt;br /&gt;
 		intVectorInit (arrivalCitys, arrivalData, 3);&lt;br /&gt;
 		intVectorInit (departureCitys, departureData, 3);&lt;br /&gt;
 		conf1 = new Configuration (arrivalCitys, departureCitys);&lt;br /&gt;
 &lt;br /&gt;
 		int arrivalData2[] = {2,3,1};&lt;br /&gt;
 		int departureData2[] = {3,2,1};&lt;br /&gt;
 		intVectorInit (arrivalCitys2, arrivalData2, 3);&lt;br /&gt;
 		intVectorInit (departureCitys2, departureData2, 3);&lt;br /&gt;
 		conf2 = new Configuration (arrivalCitys2, departureCitys2);&lt;br /&gt;
 &lt;br /&gt;
 		Airport* airport = new Airport();&lt;br /&gt;
 		airport-&amp;amp;gt;registerConfiguration (conf1);&lt;br /&gt;
 		airport-&amp;amp;gt;registerConfiguration (conf2);&lt;br /&gt;
 &lt;br /&gt;
 		airport-&amp;amp;gt;movePeople (1,2,10);&lt;br /&gt;
 		airport-&amp;amp;gt;movePeople (1,3,15);&lt;br /&gt;
 		airport-&amp;amp;gt;movePeople (2,3,10);&lt;br /&gt;
 		airport-&amp;amp;gt;movePeople (3,1,12);&lt;br /&gt;
 		airport-&amp;amp;gt;movePeople (3,2,20);&lt;br /&gt;
 &lt;br /&gt;
 		vector&amp;amp;lt;Configuration*&amp;amp;gt; configurations = airport-&amp;amp;gt;getSortedResult ();&lt;br /&gt;
 &lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL (119, configurations[0]-&amp;amp;gt;getTraffic());&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL (122, configurations[1]-&amp;amp;gt;getTraffic());&lt;br /&gt;
 &lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL (122, airport-&amp;amp;gt;getTraffic(0));&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL (119, airport-&amp;amp;gt;getTraffic(1));&lt;br /&gt;
 		delete airport;&lt;br /&gt;
 	}&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>