package ntut.csie.ezScrum.issue.sql.service.internal;

import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import ntut.csie.ezScrum.issue.core.IIssue;
import ntut.csie.ezScrum.issue.internal.Issue;
import ntut.csie.ezScrum.issue.sql.service.core.Configuration;
import ntut.csie.ezScrum.iteration.core.IStory;
import ntut.csie.ezScrum.iteration.core.ScrumEnum;
import ntut.csie.ezScrum.refactoring.manager.ProjectManager;
import ntut.csie.ezScrum.test.CreateData.CreateProject;
import ntut.csie.ezScrum.test.CreateData.InitialSQL;
import ntut.csie.jcis.core.util.DateUtil;
import ntut.csie.jcis.resource.core.IProject;
import org.jdom.Element;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class MantisIssueServiceTest {
	private int mProjectCount = 1;
	private CreateProject mCP;
	private Configuration mConfig;
	private MantisIssueService mMantisIssueService;
	private MantisService mMantisService;
	
	@Before
	public void setUp() throws Exception {
		mConfig = new Configuration();
		mConfig.setTestMode(true);
		mConfig.save();
		
		// 初始化 SQL
		InitialSQL ini = new InitialSQL(mConfig);
		ini.exe();											
		
		// 新增Project
		mCP = new CreateProject(mProjectCount);
		mCP.exeCreate();
		
		mMantisService = new MantisService(mConfig);
		mMantisIssueService = new MantisIssueService(mMantisService.getControl(), mConfig);
	}
	
	@After
	public void tearDown() throws Exception {
		// 初始化 SQL
		InitialSQL ini = new InitialSQL(mConfig);
		ini.exe();											
		
		//再一次關閉SQL連線,以免導致Project無法刪除
		mMantisService.closeConnect();
		
		// 刪除外部檔案
		ProjectManager projectManager = new ProjectManager();
		projectManager.deleteAllProject();
    	
    	mConfig.setTestMode(false);
		mConfig.save();
    	
		// release resource
		mCP = null;
		mConfig = null;
		mMantisIssueService = null;
		mMantisService = null;
	}		
	
	@Test
	public void testnewIssue() {
		IIssue story = new Issue();
		story.setIssueID(1);
		story.setSummary("Story_Name_One");
		story.setDescription("Story_Desc_One");
		// open connection
		mMantisService.openConnect();
		addTagElement(story, "100", "10", "200", "demo", "note");

		story.setProjectID(mCP.getProjectList().get(0).getName());
		story.setCategory(ScrumEnum.STORY_ISSUE_TYPE);

		// test method
		long storyID = mMantisIssueService.newIssue(story);
		// test method
		assertEquals(storyID, (long)1);
		
		IIssue storyOne = mMantisService.getIssue(storyID);
		assertEquals(storyOne.getSummary(), "Story_Name_One");
		assertEquals(storyOne.getDescription(), "Story_Desc_One");
		assertEquals(storyOne.getCategory(), ScrumEnum.STORY_ISSUE_TYPE);
		
		// =====================================================================
		
		IIssue story2 = new Issue();
		story2.setIssueID(2);
		story2.setSummary("Story_Name_Two");
		story2.setDescription("Story_Desc_Two");
		addTagElement(story2, "500", "50", "300", "DemoTwo", "NoteTwo");
		story2.setProjectID(mCP.getProjectList().get(0).getName());
		story2.setCategory(ScrumEnum.STORY_ISSUE_TYPE);
		
		// test method
		long storyId2 = mMantisIssueService.newIssue(story2);
		// test method
		assertEquals(storyId2, (long)2);
		
		IIssue storyTwo = mMantisService.getIssue(storyId2);
		assertEquals(storyTwo.getSummary(), "Story_Name_Two");
		assertEquals(storyTwo.getDescription(), "Story_Desc_Two");
		assertEquals(storyTwo.getCategory(), ScrumEnum.STORY_ISSUE_TYPE);
		
		// close connection
		mMantisService.closeConnect();
	}
	
	@Test
	public void testgetIssue() {
		IIssue story = new Issue();
		story.setIssueID(1);
		story.setSummary("Story_Name_One");
		story.setDescription("Story_Desc_One");		
		// open connection
		mMantisService.openConnect();
		addTagElement(story, "100", "10", "200", "demo", "note");

		story.setProjectID(mCP.getProjectList().get(0).getName());
		story.setCategory(ScrumEnum.STORY_ISSUE_TYPE);

		long storyId1 = mMantisIssueService.newIssue(story);
		
		// test method
		IIssue issue = mMantisIssueService.getIssue(storyId1);
		// test method
		assertEquals(story.getSummary(), issue.getSummary());
		assertEquals(story.getDescription(), issue.getDescription());
		assertEquals(story.getCategory(), ScrumEnum.STORY_ISSUE_TYPE);
		
		// close connection
		mMantisService.closeConnect();
	}
	
	@Test
	public void testgetProjectIssues() {
		List<IIssue> issues = new LinkedList<IIssue>();
		
		IProject project = mCP.getProjectList().get(0);
		// new 10 test data
		mMantisService.openConnect();
		for (int i=0 ; i<10 ; i++) {
			IIssue story = new Issue();
			story.setIssueID(i+1);
			story.setSummary("Story_Name_" + Integer.toString(i+1));
			story.setDescription("Story_Desc_" + Integer.toString(i+1));

			addTagElement(story, Integer.toString((i+1)*5), 
								 Integer.toString((i+1)*10), 
								 Integer.toString((i+1)*15), 
								 "Demo_" + Integer.toString(i+1), 
								 "Note_" + Integer.toString(i+1));
			story.setProjectID(project.getName());
			story.setCategory(ScrumEnum.STORY_ISSUE_TYPE);
			
			mMantisIssueService.newIssue(story);
			issues.add(story);
		}

		List<IIssue> actualIssues = mMantisIssueService.getProjectIssues(project.getName());
		
		for (int i=0 ; i<10 ; i++) {
			IIssue expectedIssue = issues.get(i);
			IIssue actualIssue = actualIssues.get(i);
			
			assertEquals(expectedIssue.getSummary(), actualIssue.getSummary());
			assertEquals(expectedIssue.getDescription(), actualIssue.getDescription());
			assertEquals(expectedIssue.getCategory(), ScrumEnum.STORY_ISSUE_TYPE);
		}
		
		// close connection
		mMantisService.closeConnect();
	}
	
	@Test
	public void testgetIssues_many_parameter() throws InterruptedException {
		IProject project = mCP.getProjectList().get(0);
		// new 10 test data
		mMantisService.openConnect();
		
		IIssue story1 = new Issue();
		story1.setIssueID(1);
		story1.setSummary("Story_Name_1");
		story1.setDescription("Story_Desc_1");

		addTagElement(story1, Integer.toString((1)*5), Integer.toString((1)*10), Integer.toString((1)*15), 
							 "Demo_1", "Note_1");
		story1.setProjectID(project.getName());
		story1.setCategory(ScrumEnum.STORY_ISSUE_TYPE);
		Thread.sleep(1000);
		mMantisIssueService.newIssue(story1);								// sprint 0, release 0
		
		
		IIssue story2 = new Issue();
		story2.setIssueID(2);
		story2.setSummary("Story_Name_2");
		story2.setDescription("Story_Desc_2");

		addTagElement(story2, Integer.toString((2)*5), Integer.toString((2)*10), Integer.toString((2)*15), 
							 "Demo_2", "Note_2");
		story2.setProjectID(project.getName());
		story2.setCategory(ScrumEnum.STORY_ISSUE_TYPE);
		mMantisIssueService.newIssue(story2);
		Thread.sleep(1000);
		addSprintReleaseElement(project, story2, "1", "1");	// sprint 1, release 1
		
		
		IIssue story3 = new Issue();
		story3.setIssueID(3);
		story3.setSummary("Story_Name_3");
		story3.setDescription("Story_Desc_3");

		addTagElement(story3, Integer.toString((3)*5), Integer.toString((3)*10), Integer.toString((3)*15), 
							 "Demo_3", "Note_3");
		story3.setProjectID(project.getName());
		story3.setCategory(ScrumEnum.STORY_ISSUE_TYPE);
		mMantisIssueService.newIssue(story3);
		Thread.sleep(1000);
		addSprintReleaseElement(project, story3, "1", "1");	// sprint 1, release 1
		
		
		IIssue story4 = new Issue();
		story4.setIssueID(4);
		story4.setSummary("Story_Name_4");
		story4.setDescription("Story_Desc_4");

		addTagElement(story4, Integer.toString((4)*5), Integer.toString((4)*10), Integer.toString((4)*15), 
							 "Demo_4", "Note_4");
		story4.setProjectID(project.getName());
		story4.setCategory(ScrumEnum.STORY_ISSUE_TYPE);
		mMantisIssueService.newIssue(story4);
		Thread.sleep(1000);
		addSprintReleaseElement(project, story4, "2", "1");	// sprint 2, release 1
		
		
		IIssue story5 = new Issue();
		story5.setIssueID(5);
		story5.setSummary("Story_Name_5");
		story5.setDescription("Story_Desc_5");

		addTagElement(story5, Integer.toString((5)*5), Integer.toString((5)*10), Integer.toString((5)*15), 
							 "Demo_5", "Note_5");
		story5.setProjectID(project.getName());
		story5.setCategory(ScrumEnum.STORY_ISSUE_TYPE);
		mMantisIssueService.newIssue(story5);
		addSprintReleaseElement(project, story5, "2", "1");	// sprint 2, release 1
		
		
		
		IIssue story6 = new Issue();
		story6.setIssueID(6);
		story6.setSummary("Story_Name_6");
		story6.setDescription("Story_Desc_6");

		addTagElement(story6, Integer.toString((6)*5), Integer.toString((6)*10), Integer.toString((6)*15), 
							 "Demo_6", "Note_6");
		story6.setProjectID(project.getName());
		story6.setCategory(ScrumEnum.STORY_ISSUE_TYPE);
		mMantisIssueService.newIssue(story6);
		addSprintReleaseElement(project, story6, "3", "2");	// sprint 3, release 2
		
		
		
		IIssue story7 = new Issue();
		story7.setIssueID(7);
		story7.setSummary("Story_Name_7");
		story7.setDescription("Story_Desc_7");

		addTagElement(story7, Integer.toString((7)*5), Integer.toString((7)*10), Integer.toString((7)*15), 
							 "Demo_7", "Note_7");
		story7.setProjectID(project.getName());
		story7.setCategory(ScrumEnum.STORY_ISSUE_TYPE);
		mMantisIssueService.newIssue(story7);
		addSprintReleaseElement(project, story7, "3", "2");	// sprint 3, release 2
		
		
		
		IIssue story8 = new Issue();
		story8.setIssueID(8);
		story8.setSummary("Story_Name_8");
		story8.setDescription("Story_Desc_8");

		addTagElement(story8, Integer.toString((8)*5), Integer.toString((8)*10), Integer.toString((8)*15), 
							 "Demo_8", "Note_8");
		story8.setProjectID(project.getName());
		story8.setCategory(ScrumEnum.STORY_ISSUE_TYPE);
		mMantisIssueService.newIssue(story8);
		addSprintReleaseElement(project, story8, "4", "2");	// sprint 4, release 2
		
		
		
		IIssue story9 = new Issue();
		story9.setIssueID(9);
		story9.setSummary("Story_Name_9");
		story9.setDescription("Story_Desc_9");

		addTagElement(story9, Integer.toString((9)*5), Integer.toString((9)*10), Integer.toString((9)*15), 
							 "Demo_9", "Note_9");
		story9.setProjectID(project.getName());
		story9.setCategory(ScrumEnum.STORY_ISSUE_TYPE);
		mMantisIssueService.newIssue(story9);
		addSprintReleaseElement(project, story9, "4", "2");	// sprint 4, release 2
		
		
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		// test method
		IIssue[] actualIssues = mMantisIssueService.getIssues(project.getName(), ScrumEnum.STORY_ISSUE_TYPE, "0", "0", new Date());
		// test method
		assertEquals(0, actualIssues.length);
		
		
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		// test method 		
		actualIssues = mMantisIssueService.getIssues(project.getName(), ScrumEnum.STORY_ISSUE_TYPE, "1", null, new Date());
		
		// assert: 若測試失敗,請檢查 DB table "ezscrum_story_relation" 是否漏掉estimation與importance欄位
		assertEquals(4, actualIssues.length);
		assertEquals(2, actualIssues[0].getIssueID());
		assertEquals(3, actualIssues[1].getIssueID());
		assertEquals(4, actualIssues[2].getIssueID());
		assertEquals(5, actualIssues[3].getIssueID());
		
		
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		// test method
		actualIssues = mMantisIssueService.getIssues(project.getName(), ScrumEnum.STORY_ISSUE_TYPE, "2", null, new Date());
		Arrays.sort(actualIssues, new ComparatorByIssueID());
		
		// test method
		assertEquals(4, actualIssues.length);
		assertEquals(6, actualIssues[0].getIssueID());
		assertEquals(7, actualIssues[1].getIssueID());
		assertEquals(8, actualIssues[2].getIssueID());
		assertEquals(9, actualIssues[3].getIssueID());
		
		
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		// test method
		actualIssues = mMantisIssueService.getIssues(project.getName(), ScrumEnum.STORY_ISSUE_TYPE, null, "1", new Date());
		// test method
		assertEquals(2, actualIssues.length);
		assertEquals(2, actualIssues[0].getIssueID());
		assertEquals(3, actualIssues[1].getIssueID());
		
		
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		// test method
		actualIssues = mMantisIssueService.getIssues(project.getName(), ScrumEnum.STORY_ISSUE_TYPE, null, "2", new Date());
		// test method
		assertEquals(2, actualIssues.length);
		assertEquals(4, actualIssues[0].getIssueID());
		assertEquals(5, actualIssues[1].getIssueID());
		
		
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		// test method
		actualIssues = mMantisIssueService.getIssues(project.getName(), ScrumEnum.STORY_ISSUE_TYPE, null, "3", new Date());
		// test method
		assertEquals(2, actualIssues.length);
		assertEquals(6, actualIssues[0].getIssueID());
		assertEquals(7, actualIssues[1].getIssueID());
		
		
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		// test method
		actualIssues = mMantisIssueService.getIssues(project.getName(), ScrumEnum.STORY_ISSUE_TYPE, null, "4", new Date());
		// test method
		assertEquals(2, actualIssues.length);
		assertEquals(8, actualIssues[0].getIssueID());
		assertEquals(9, actualIssues[1].getIssueID());
		
		// close connection
		mMantisService.closeConnect();
	}
	
	@Test
	public void testgetIssues_project() {
		List<IIssue> stories = new LinkedList<IIssue>();
		
		IProject testProject = mCP.getProjectList().get(0);
		// new 10 test data
		mMantisService.openConnect();
		for (int i = 0 ; i < 10 ; i++) {
			IIssue story = new Issue();
			story.setIssueID(i + 1);
			story.setSummary("Story_Name_" + Integer.toString(i+1));
			story.setDescription("Story_Desc_" + Integer.toString(i+1));

			addTagElement(story, Integer.toString((i + 1) * 5), 
								 Integer.toString((i + 1) * 10), 
								 Integer.toString((i + 1) * 15), 
								 "Demo_" + Integer.toString(i+1), 
								 "Note_" + Integer.toString(i+1));
			story.setProjectID(testProject.getName());
			story.setCategory(ScrumEnum.STORY_ISSUE_TYPE);
			
			mMantisIssueService.newIssue(story);
			stories.add(story);
		}
		
		// new 10 test task data
		for (int i = 10 ; i < 20 ; i++) {
			IIssue story = new Issue();
			story.setIssueID(i + 1);
			story.setSummary("Task_Name_" + Integer.toString(i + 1));
			story.setDescription("Task_Desc_" + Integer.toString(i + 1));

			addTagElement(story, Integer.toString((i + 1) * 5), 
								 Integer.toString((i + 1) * 10), 
								 Integer.toString((i + 1) * 15), 
								 "Demo_" + Integer.toString(i + 1), 
								 "Note_" + Integer.toString(i + 1));
			story.setProjectID(testProject.getName());
			story.setCategory(ScrumEnum.TASK_ISSUE_TYPE);
			
			mMantisIssueService.newIssue(story);
			stories.add(story);
		}
		
		// test method
		IIssue[] actual_Issues = mMantisIssueService.getIssues(testProject.getName());
		// test method
		
		assertEquals(20, actual_Issues.length);
		for (int i = 0 ; i < 10 ; i++) {
			IIssue expectedIssue = stories.get(i);
			assertEquals(expectedIssue.getProjectID(), actual_Issues[i].getProjectID());
			assertEquals(expectedIssue.getSummary(), actual_Issues[i].getSummary());
			assertEquals(expectedIssue.getCategory(), ScrumEnum.STORY_ISSUE_TYPE);
		}
		for (int i = 10 ; i < 20 ; i++) {
			IIssue expectedIssue = stories.get(i);
			assertEquals(expectedIssue.getProjectID(), actual_Issues[i].getProjectID());
			assertEquals(expectedIssue.getSummary(), actual_Issues[i].getSummary());
			assertEquals(expectedIssue.getCategory(), ScrumEnum.TASK_ISSUE_TYPE);
		}
		
		
		// test method
		actual_Issues = mMantisIssueService.getIssues("UnExistedProject", ScrumEnum.TASK_ISSUE_TYPE);
		// test method
		assertEquals(0, actual_Issues.length);
		
		// test method
		actual_Issues = mMantisIssueService.getIssues(testProject.getName(), "UnExistedCategory");
		// test method
		assertEquals(0, actual_Issues.length);
		
		
		// close connection
		mMantisService.closeConnect();
	}
	
	@Test
	public void testgetIssues_project_category() {
		List<IIssue> story_list = new LinkedList<IIssue>();
		
		IProject testProject = mCP.getProjectList().get(0);
		// new 10 test data
		mMantisService.openConnect();
		for (int i = 0 ; i < 10 ; i++) {
			IIssue story = new Issue();
			story.setIssueID(i + 1);
			story.setSummary("Story_Name_" + Integer.toString(i + 1));
			story.setDescription("Story_Desc_" + Integer.toString(i + 1));

			addTagElement(story, Integer.toString((i + 1) * 5), 
								 Integer.toString((i + 1) * 10), 
								 Integer.toString((i + 1) * 15), 
								 "Demo_" + Integer.toString(i + 1), 
								 "Note_" + Integer.toString(i + 1));
			story.setProjectID(testProject.getName());
			story.setCategory(ScrumEnum.STORY_ISSUE_TYPE);
			
			mMantisIssueService.newIssue(story);
			story_list.add(story);
		}
		
		// new 10 test task data
		for (int i = 10 ; i < 20 ; i++) {
			IIssue story = new Issue();
			story.setIssueID(i + 1);
			story.setSummary("Task_Name_" + Integer.toString(i + 1));
			story.setDescription("Task_Desc_" + Integer.toString(i + 1));

			addTagElement(story, Integer.toString((i + 1) * 5), 
								 Integer.toString((i + 1) * 10), 
								 Integer.toString((i + 1) * 15), 
								 "Demo_" + Integer.toString(i + 1), 
								 "Note_" + Integer.toString(i + 1));
			story.setProjectID(testProject.getName());
			story.setCategory(ScrumEnum.TASK_ISSUE_TYPE);
			
			mMantisIssueService.newIssue(story);
			story_list.add(story);
		}
		
		// test method
		IIssue[] actual_Issues = mMantisIssueService.getIssues(testProject.getName(), ScrumEnum.STORY_ISSUE_TYPE);
		// test method
		
		assertEquals(10, actual_Issues.length);
		for (int i = 0 ; i < 10 ; i++) {
			IIssue expectedIssue = story_list.get(i);
			assertEquals(expectedIssue.getProjectID(), actual_Issues[i].getProjectID());
			assertEquals(expectedIssue.getSummary(), actual_Issues[i].getSummary());
			assertEquals(expectedIssue.getCategory(), ScrumEnum.STORY_ISSUE_TYPE);
		}
		
		
		// test method
		actual_Issues = mMantisIssueService.getIssues(testProject.getName(), ScrumEnum.TASK_ISSUE_TYPE);
		// test method
		
		assertEquals(10, actual_Issues.length);
		for (int i = 0 ; i < 10 ; i++) {
			IIssue expectedIssue = story_list.get(i + 10);
			assertEquals(expectedIssue.getProjectID(), actual_Issues[i].getProjectID());
			assertEquals(expectedIssue.getSummary(), actual_Issues[i].getSummary());
			assertEquals(expectedIssue.getCategory(), ScrumEnum.TASK_ISSUE_TYPE);
		}
		
		// test method
		actual_Issues = mMantisIssueService.getIssues("UnExistedProject", ScrumEnum.TASK_ISSUE_TYPE);
		// test method
		assertEquals(0, actual_Issues.length);
		
		// test method
		actual_Issues = mMantisIssueService.getIssues(testProject.getName(), "UnExistedCategory");
		// test method
		assertEquals(0, actual_Issues.length);
		
		
		// close connection
		mMantisService.closeConnect();
	}
	
	@Test
	public void testremoveIssue() {
		List<IIssue> issue_list = new LinkedList<IIssue>();
		
		IProject testProject = mCP.getProjectList().get(0);
		// new 10 test story data
		mMantisService.openConnect();
		for (int i = 0 ; i < 10 ; i++) {
			IIssue story = new Issue();
			story.setIssueID(i + 1);
			story.setSummary("Story_Name_" + Integer.toString(i + 1));
			story.setDescription("Story_Desc_" + Integer.toString(i + 1));

			addTagElement(story, Integer.toString((i + 1) * 5), 
								 Integer.toString((i + 1) * 10), 
								 Integer.toString((i + 1) * 15), 
								 "Demo_" + Integer.toString(i + 1), 
								 "Note_" + Integer.toString(i + 1));
			story.setProjectID(testProject.getName());
			story.setCategory(ScrumEnum.STORY_ISSUE_TYPE);
			
			mMantisIssueService.newIssue(story);
			issue_list.add(story);
		}
		
		// test method
		mMantisIssueService.removeIssue("1");
		// test method
		
		issue_list.remove(0);
		List<IStory> actual_list = mMantisIssueService.getStorys(testProject.getName());
		assertEquals(9, actual_list.size());
		for (int i = 0 ; i < 9 ; i++) {
			IIssue expectedIssue = issue_list.get(i);
			IStory actualIssue = actual_list.get(i);
			
			assertEquals(expectedIssue.getProjectID(), actualIssue.getProjectID());
			assertEquals(expectedIssue.getSummary(), actualIssue.getSummary());
			assertEquals(expectedIssue.getCategory(), ScrumEnum.STORY_ISSUE_TYPE);
		}
		
		
		// test method
		mMantisIssueService.removeIssue("10");
		// test method
		
		issue_list.remove(8);
		actual_list = mMantisIssueService.getStorys(testProject.getName());
		assertEquals(8, actual_list.size());
		for (int i = 0 ; i < 8 ; i++) {
			IIssue expectedIssue = issue_list.get(i);
			IStory actualIssue = actual_list.get(i);
			
			assertEquals(expectedIssue.getProjectID(), actualIssue.getProjectID());
			assertEquals(expectedIssue.getSummary(), actualIssue.getSummary());
			assertEquals(expectedIssue.getCategory(), ScrumEnum.STORY_ISSUE_TYPE);
		}
		
		
		// close connection
		mMantisService.closeConnect();
	}
	
	@Test
	public void testgetStorys() {
		List<IIssue> issue_list = new LinkedList<IIssue>();
		
		IProject testProject = mCP.getProjectList().get(0);
		// new 10 test story data
		mMantisService.openConnect();
		for (int i = 0 ; i < 10 ; i++) {
			IIssue story = new Issue();
			story.setIssueID(i + 1);
			story.setSummary("Story_Name_" + Integer.toString(i + 1));
			story.setDescription("Story_Desc_" + Integer.toString(i + 1));

			addTagElement(story, Integer.toString((i + 1) * 5), 
								 Integer.toString((i + 1) * 10), 
								 Integer.toString((i + 1) * 15), 
								 "Demo_" + Integer.toString(i + 1), 
								 "Note_" + Integer.toString(i + 1));
			story.setProjectID(testProject.getName());
			story.setCategory(ScrumEnum.STORY_ISSUE_TYPE);
			
			mMantisIssueService.newIssue(story);
			issue_list.add(story);
		}
		
		// new 10 test task data
		for (int i=10 ; i<20 ; i++) {
			IIssue story = new Issue();
			story.setIssueID(i + 1);
			story.setSummary("Task_Name_" + Integer.toString(i + 1));
			story.setDescription("Task_Desc_" + Integer.toString(i + 1));

			addTagElement(story, Integer.toString((i + 1) * 5), 
								 Integer.toString((i + 1) * 10), 
								 Integer.toString((i + 1) * 15), 
								 "Demo_" + Integer.toString(i + 1), 
								 "Note_" + Integer.toString(i + 1));
			story.setProjectID(testProject.getName());
			story.setCategory(ScrumEnum.TASK_ISSUE_TYPE);
			
			mMantisIssueService.newIssue(story);
			issue_list.add(story);
		}
		
		// test method
		List<IStory> actual_list = mMantisIssueService.getStorys(testProject.getName());
		// test method
		
		assertEquals(10, actual_list.size());
		for (int i = 0 ; i < 10 ; i++) {
			IIssue expectedIssue = issue_list.get(i);
			IStory actualIssue = actual_list.get(i);
			
			assertEquals(expectedIssue.getProjectID(), actualIssue.getProjectID());
			assertEquals(expectedIssue.getSummary(), actualIssue.getSummary());
			assertEquals(expectedIssue.getCategory(), ScrumEnum.STORY_ISSUE_TYPE);
		}
		
		// close connection
		mMantisService.closeConnect();
	}
	
	private void addSprintReleaseElement(IProject p, IIssue issue, String sprintID, String releaseID) {
		// history node
		Element history = new Element(ScrumEnum.HISTORY_TAG);

		Date current = new Date();
		String dateTime = DateUtil.format(current, DateUtil._16DIGIT_DATE_TIME_2);
		history.setAttribute(ScrumEnum.ID_HISTORY_ATTR, dateTime);

		// iteration node
		Element iteration = new Element(ScrumEnum.SPRINT_ID);
		iteration.setText(sprintID);
		history.addContent(iteration);
		issue.addTagValue(history);
		
		mMantisService.updateBugNote(issue);
		mMantisService.updateStoryRelationTable(issue.getIssueID(), p.getName(), releaseID, sprintID, "100", "100", new Date());
	}
	
	private void addTagElement(IIssue issue, String imp, String est, String value, String howtodemo, String notes) {
		Element history = new Element(ScrumEnum.HISTORY_TAG);
		history.setAttribute(ScrumEnum.ID_HISTORY_ATTR, DateUtil.format(new Date(), DateUtil._16DIGIT_DATE_TIME_2));

		if (imp != null && !imp.equals("")) {
			Element importanceElem = new Element(ScrumEnum.IMPORTANCE);
			int temp = (int) Float.parseFloat(imp);
			importanceElem.setText(temp + "");
			history.addContent(importanceElem);
		}

		if (est != null && !est.equals("")) {
			Element storyPoint = new Element(ScrumEnum.ESTIMATION);
			storyPoint.setText(est);
			history.addContent(storyPoint);
		}
		
		if(value != null && !value.equals("")) {
			Element customValue = new Element(ScrumEnum.VALUE);
			customValue.setText(value);
			history.addContent(customValue);
		}
		
		Element howToDemoElem = new Element(ScrumEnum.HOWTODEMO);
		howToDemoElem.setText(howtodemo);
		history.addContent(howToDemoElem);

		Element notesElem = new Element(ScrumEnum.NOTES);
		notesElem.setText(notes);
		history.addContent(notesElem);
		
		if (history.getChildren().size() > 0) {
			issue.addTagValue(history);
			mMantisService.updateBugNote(issue);
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}