package org.openRealmOfStars.game.tutorial;

import static org.junit.Assert.*;

import java.util.ArrayList;

import org.junit.Test;
import org.junit.experimental.categories.Category;
/**
*
* Open Realm of Stars game project
* Copyright (C) 2019 Tuomo Untinen
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see http://www.gnu.org/licenses/
*
* Test tutorial list class.
*
*/
public class TutorialListTest {

  @Test
  @Category(org.openRealmOfStars.UnitTest.class)
  public void testCorrectOrder() {
    TutorialList list = new TutorialList();
    HelpLine line = new HelpLine(0);
    list.add(line);
    assertEquals(1, list.getSize());
    line = new HelpLine(1);
    list.add(line);
    assertEquals(2, list.getSize());
    line = new HelpLine(2);
    list.add(line);
    assertEquals(3, list.getSize());
    line = new HelpLine(3);
    list.add(line);
    assertEquals(4, list.getSize());
    line = new HelpLine(4);
    list.add(line);
    assertEquals(5, list.getSize());
    assertEquals("0:  - \n" + 
        "1:  - \n" + 
        "2:  - \n" + 
        "3:  - \n" + 
        "4:  - \n", list.toString());
  }

  @Test
  @Category(org.openRealmOfStars.UnitTest.class)
  public void testWrongOrder() {
    TutorialList list = new TutorialList();
    HelpLine line = new HelpLine(4);
    list.add(line);
    line = new HelpLine(3);
    list.add(line);
    line = new HelpLine(2);
    list.add(line);
    line = new HelpLine(1);
    list.add(line);
    line = new HelpLine(0);
    list.add(line);
    assertEquals("0:  - \n" + 
        "1:  - \n" + 
        "2:  - \n" + 
        "3:  - \n" + 
        "4:  - \n", list.toString());
  }

  @Test
  @Category(org.openRealmOfStars.UnitTest.class)
  public void testWrongOrderSkipIndexes() {
    TutorialList list = new TutorialList();
    HelpLine line = new HelpLine(8);
    list.add(line);
    line = new HelpLine(6);
    list.add(line);
    line = new HelpLine(4);
    list.add(line);
    line = new HelpLine(2);
    list.add(line);
    line = new HelpLine(0);
    list.add(line);
    assertEquals("0:  - \n" + 
        "2:  - \n" + 
        "4:  - \n" + 
        "6:  - \n" + 
        "8:  - \n", list.toString());
  }

  @Test
  @Category(org.openRealmOfStars.UnitTest.class)
  public void testCorrectOrderSkipIndexes() {
    TutorialList list = new TutorialList();
    HelpLine line = new HelpLine(0);
    list.add(line);
    line = new HelpLine(2);
    list.add(line);
    line = new HelpLine(4);
    list.add(line);
    line = new HelpLine(6);
    list.add(line);
    line = new HelpLine(8);
    list.add(line);
    assertEquals("0:  - \n" + 
        "2:  - \n" + 
        "4:  - \n" + 
        "6:  - \n" + 
        "8:  - \n", list.toString());
  }

  @Test
  @Category(org.openRealmOfStars.UnitTest.class)
  public void testFirstIndex() {
    TutorialList list = new TutorialList();
    assertEquals(null, list.get(0));
    HelpLine line = new HelpLine(0);
    list.add(line);
    assertEquals(line, list.get(0));
  }

  @Test
  @Category(org.openRealmOfStars.UnitTest.class)
  public void testWrongOrderSkipIndexesGet() {
    TutorialList list = new TutorialList();
    HelpLine line = new HelpLine(8);
    list.add(line);
    line = new HelpLine(6);
    list.add(line);
    line = new HelpLine(4);
    list.add(line);
    line = new HelpLine(2);
    list.add(line);
    line = new HelpLine(0);
    list.add(line);
    assertEquals("0:  - \n" + 
        "2:  - \n" + 
        "4:  - \n" + 
        "6:  - \n" + 
        "8:  - \n", list.toString());
    assertEquals(0, list.get(0).getIndex());
    assertEquals(2, list.get(1).getIndex());
    assertEquals(4, list.get(2).getIndex());
    assertEquals(6, list.get(3).getIndex());
    assertEquals(8, list.get(4).getIndex());
  }

  @Test
  @Category(org.openRealmOfStars.UnitTest.class)
  public void testWrongOrderReplace() {
    TutorialList list = new TutorialList();
    HelpLine line = new HelpLine(8);
    list.add(line);
    line = new HelpLine(6);
    list.add(line);
    line = new HelpLine(4);
    list.add(line);
    line = new HelpLine(8);
    list.add(line);
    line = new HelpLine(4);
    list.add(line);
    line = new HelpLine(3);
    list.add(line);
    assertEquals("3:  - \n" + 
        "4:  - \n" + 
        "6:  - \n" + 
        "8:  - \n", list.toString());
  }

  @Test
  @Category(org.openRealmOfStars.UnitTest.class)
  public void testImmediateReplace() {
    TutorialList list = new TutorialList();
    HelpLine line = new HelpLine(8);
    list.add(line);
    line = new HelpLine(8);
    list.add(line);
    assertEquals("8:  - \n", list.toString()); 
  }

  @Test
  @Category(org.openRealmOfStars.UnitTest.class)
  public void testOddOrderGetIndex() {
    TutorialList list = new TutorialList();
    assertEquals(null, list.getByIndex(42));
    HelpLine line = new HelpLine(25);
    list.add(line);
    line = new HelpLine(16);
    list.add(line);
    line = new HelpLine(21);
    list.add(line);
    line = new HelpLine(42);
    list.add(line);
    line = new HelpLine(12);
    list.add(line);
    assertEquals("12:  - \n" + 
        "16:  - \n" + 
        "21:  - \n" + 
        "25:  - \n" + 
        "42:  - \n", list.toString());
    assertEquals(42, list.getByIndex(42).getIndex());
    assertEquals(25, list.getByIndex(25).getIndex());
    assertEquals(21, list.getByIndex(21).getIndex());
    assertEquals(16, list.getByIndex(16).getIndex());
  }

  @Test
  @Category(org.openRealmOfStars.UnitTest.class)
  public void testShownIndexList() {
    TutorialList list = new TutorialList();
    HelpLine line = new HelpLine(5);
    line.setShown(false);
    list.add(line);
    line = new HelpLine(7);
    line.setShown(true);
    list.add(line);
    line = new HelpLine(2);
    line.setShown(true);
    list.add(line);
    line = new HelpLine(3);
    line.setShown(false);
    list.add(line);
    ArrayList<Integer> indexes = list.getShownIndexes();
    assertEquals(2, indexes.size());
    assertEquals(2, indexes.get(0).intValue());
    assertEquals(7, indexes.get(1).intValue());
  }

  @Test
  @Category(org.openRealmOfStars.UnitTest.class)
  public void testUpdateShownIndexList() {
    TutorialList list = new TutorialList();
    HelpLine line = new HelpLine(5);
    list.add(line);
    line = new HelpLine(7);
    list.add(line);
    line = new HelpLine(2);
    list.add(line);
    line = new HelpLine(3);
    list.add(line);
    line = new HelpLine(12);
    list.add(line);
    line = new HelpLine(19);
    list.add(line);
    line = new HelpLine(11);
    list.add(line);
    ArrayList<Integer> indexes = new ArrayList<>();
    Integer value = new Integer(7);
    indexes.add(value);
    value = new Integer(13);
    indexes.add(value);
    value = new Integer(12);
    indexes.add(value);
    value = new Integer(11);
    indexes.add(value);
    list.updateShownTutorial(indexes);
    assertEquals(false, list.getByIndex(2).isShown());
    assertEquals(false, list.getByIndex(3).isShown());
    assertEquals(false, list.getByIndex(5).isShown());
    assertEquals(true, list.getByIndex(7).isShown());
    assertEquals(true, list.getByIndex(12).isShown());
    assertEquals(true, list.getByIndex(11).isShown());
    assertEquals(null, list.getByIndex(13));
    assertEquals(false, list.getByIndex(19).isShown());
  }

}