Added class for lottery numbers and unit tests for it
This commit is contained in:
parent
06546ae3cf
commit
b0f96adeb1
@ -23,11 +23,12 @@
|
|||||||
package com.iluwatar.hexagonal;
|
package com.iluwatar.hexagonal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hello world!
|
*
|
||||||
|
* Example application demonstrating Hexagonal Architecture
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class App {
|
public class App {
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
System.out.println("Hello World!");
|
System.out.println("Running hexagonal example");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,152 @@
|
|||||||
|
/**
|
||||||
|
* The MIT License
|
||||||
|
* Copyright (c) 2014 Ilkka Seppälä
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
package com.iluwatar.hexagonal.domain;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.PrimitiveIterator;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Value object representing lottery numbers. This lottery uses sets of 4 numbers. The numbers must be unique and
|
||||||
|
* between 1 and 20.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class LotteryNumbers {
|
||||||
|
|
||||||
|
private final Set<Integer> numbers;
|
||||||
|
|
||||||
|
public static final int MIN_NUMBER = 1;
|
||||||
|
public static final int MAX_NUMBER = 20;
|
||||||
|
public static final int NUM_NUMBERS = 4;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor. Creates random lottery numbers.
|
||||||
|
*/
|
||||||
|
private LotteryNumbers() {
|
||||||
|
numbers = new HashSet<>();
|
||||||
|
generateRandomNumbers();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor. Uses given numbers.
|
||||||
|
*/
|
||||||
|
private LotteryNumbers(Set<Integer> givenNumbers) {
|
||||||
|
numbers = new HashSet<>();
|
||||||
|
numbers.addAll(givenNumbers);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return random LotteryNumbers
|
||||||
|
*/
|
||||||
|
public static LotteryNumbers createRandom() {
|
||||||
|
return new LotteryNumbers();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return given LotteryNumbers
|
||||||
|
*/
|
||||||
|
public static LotteryNumbers create(Set<Integer> givenNumbers) {
|
||||||
|
return new LotteryNumbers(givenNumbers);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return lottery numbers
|
||||||
|
*/
|
||||||
|
public Set<Integer> getNumbers() {
|
||||||
|
return Collections.unmodifiableSet(numbers);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
final int prime = 31;
|
||||||
|
int result = 1;
|
||||||
|
result = prime * result + ((numbers == null) ? 0 : numbers.hashCode());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (obj == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (getClass() != obj.getClass()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
LotteryNumbers other = (LotteryNumbers) obj;
|
||||||
|
if (numbers == null) {
|
||||||
|
if (other.numbers != null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else if (!numbers.equals(other.numbers)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates 4 unique random numbers between 1-20 into numbers set.
|
||||||
|
*/
|
||||||
|
private void generateRandomNumbers() {
|
||||||
|
numbers.clear();
|
||||||
|
RandomNumberGenerator generator = new RandomNumberGenerator(MIN_NUMBER, MAX_NUMBER);
|
||||||
|
while (numbers.size() < NUM_NUMBERS) {
|
||||||
|
int num = generator.nextInt();
|
||||||
|
if (!numbers.contains(num)) {
|
||||||
|
numbers.add(num);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Helper class for generating random numbers.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static class RandomNumberGenerator {
|
||||||
|
|
||||||
|
private PrimitiveIterator.OfInt randomIterator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize a new random number generator that generates random numbers in the range [min, max]
|
||||||
|
*
|
||||||
|
* @param min the min value (inclusive)
|
||||||
|
* @param max the max value (inclusive)
|
||||||
|
*/
|
||||||
|
public RandomNumberGenerator(int min, int max) {
|
||||||
|
randomIterator = new Random().ints(min, max + 1).iterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return a random number in the range (min, max)
|
||||||
|
*/
|
||||||
|
public int nextInt() {
|
||||||
|
return randomIterator.nextInt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -22,8 +22,6 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.hexagonal;
|
package com.iluwatar.hexagonal;
|
||||||
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -31,11 +29,9 @@ import org.junit.Test;
|
|||||||
*/
|
*/
|
||||||
public class AppTest {
|
public class AppTest {
|
||||||
|
|
||||||
/**
|
|
||||||
* Rigourous Test :-)
|
|
||||||
*/
|
|
||||||
@Test
|
@Test
|
||||||
public void testApp() {
|
public void testApp() {
|
||||||
assertTrue(true);
|
String[] args = {};
|
||||||
|
App.main(args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,66 @@
|
|||||||
|
/**
|
||||||
|
* The MIT License
|
||||||
|
* Copyright (c) 2014 Ilkka Seppälä
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
package com.iluwatar.hexagonal.domain;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Unit tests for {@link LotteryNumbers}
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class LotteryNumbersTest {
|
||||||
|
|
||||||
|
private static final int NUM_RANDOM_NUMBER_ROUNDS = 1000;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGivenNumbers() {
|
||||||
|
LotteryNumbers numbers = LotteryNumbers.create(
|
||||||
|
new HashSet<>(Arrays.asList(1, 2, 3, 4)));
|
||||||
|
assertEquals(numbers.getNumbers().size(), 4);
|
||||||
|
assertTrue(numbers.getNumbers().contains(1));
|
||||||
|
assertTrue(numbers.getNumbers().contains(2));
|
||||||
|
assertTrue(numbers.getNumbers().contains(3));
|
||||||
|
assertTrue(numbers.getNumbers().contains(4));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = UnsupportedOperationException.class)
|
||||||
|
public void testNumbersCantBeModified() {
|
||||||
|
LotteryNumbers numbers = LotteryNumbers.create(
|
||||||
|
new HashSet<>(Arrays.asList(1, 2, 3, 4)));
|
||||||
|
numbers.getNumbers().add(5);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRandomNumbers() {
|
||||||
|
for (int i = 0; i < NUM_RANDOM_NUMBER_ROUNDS; i++) {
|
||||||
|
LotteryNumbers numbers = LotteryNumbers.createRandom();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user