package net.azib.ipscan.feeders;

import org.junit.Test;

import static net.azib.ipscan.feeders.FeederTestUtils.assertFeederException;
import static org.junit.Assert.*;

public class RangeFeederTest {
	@Test
	public void forward() throws FeederException {
		var feeder = new RangeFeeder("10.11.12.13", "10.11.12.15");
		assertTrue(feeder.hasNext());
		assertEquals("10.11.12.13", feeder.next().getAddress().getHostAddress());
		assertTrue(feeder.hasNext());
		assertEquals("10.11.12.14", feeder.next().getAddress().getHostAddress());
		assertTrue(feeder.hasNext());
		assertEquals("10.11.12.15", feeder.next().getAddress().getHostAddress());
		assertFalse(feeder.hasNext());
	}
	
	@Test
	public void reverse() {
		var feeder = new RangeFeeder("10.11.12.13", "10.11.12.11");
		assertTrue(feeder.isReverse);
		assertEquals("10.11.12.13", feeder.next().getAddress().getHostAddress());
		assertEquals("10.11.12.12", feeder.next().getAddress().getHostAddress());
		assertEquals("10.11.12.11", feeder.next().getAddress().getHostAddress());
		assertFalse(feeder.hasNext());
	}

	@Test
	public void malformedIP() {
		try {
			new RangeFeeder("10.11.12.blah.", "10.11.12.10");
			fail();
		}
		catch (FeederException e) {
			assertFeederException("malformedIP", e);
		}
		try {
			new RangeFeeder("10.11.12.1", "ziga,");
			fail();
		}
		catch (FeederException e) {
			assertFeederException("malformedIP", e);
		}
	}
	
	@Test
	public void extremeValues() {
		RangeFeeder rangeFeeder = null; 
		
		rangeFeeder = new RangeFeeder("0.0.0.0", "0.0.0.0");
		assertTrue(rangeFeeder.hasNext());
		assertEquals("0.0.0.0", rangeFeeder.next().getAddress().getHostAddress());
		assertFalse(rangeFeeder.hasNext());
		
		rangeFeeder = new RangeFeeder("255.255.255.255", "255.255.255.255");
		assertTrue(rangeFeeder.hasNext());
		assertEquals("255.255.255.255", rangeFeeder.next().getAddress().getHostAddress());
		assertFalse(rangeFeeder.hasNext());
	}
		
	@Test
	public void getPercentageComplete() {
		var rangeFeeder = new RangeFeeder("100.11.12.13", "100.11.12.15");
		assertEquals(0, rangeFeeder.percentageComplete());
		rangeFeeder.next();
		assertEquals(33, rangeFeeder.percentageComplete());
		rangeFeeder.next();
		assertEquals(67, rangeFeeder.percentageComplete());
		rangeFeeder.next();
		assertEquals(100, rangeFeeder.percentageComplete());
		
		rangeFeeder = new RangeFeeder("255.255.255.255", "255.255.255.255");
		assertEquals(0, rangeFeeder.percentageComplete());
		rangeFeeder.next();
		assertEquals(100, rangeFeeder.percentageComplete());
	}

	@Test
	public void getPercentageCompleteIPv6() {
		var rangeFeeder = new RangeFeeder("::1", "::3");
		assertEquals(0, rangeFeeder.percentageComplete());
		rangeFeeder.next();
		assertEquals(33, rangeFeeder.percentageComplete());
		rangeFeeder.next();
		assertEquals(67, rangeFeeder.percentageComplete());
		rangeFeeder.next();
		assertEquals(100, rangeFeeder.percentageComplete());
	}

	@Test
	public void getInfo() {
		var rangeFeeder = new RangeFeeder("100.11.12.13", "100.11.12.13");
		assertEquals("100.11.12.13 - 100.11.12.13", rangeFeeder.getInfo());
		rangeFeeder = new RangeFeeder("0.0.0.0", "255.255.255.255");
		assertEquals("0.0.0.0 - 255.255.255.255", rangeFeeder.getInfo());
	}
}
