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;
|
||||
|
||||
/**
|
||||
* Hello world!
|
||||
*
|
||||
* Example application demonstrating Hexagonal Architecture
|
||||
*
|
||||
*/
|
||||
public class App {
|
||||
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;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
@ -31,11 +29,9 @@ import org.junit.Test;
|
||||
*/
|
||||
public class AppTest {
|
||||
|
||||
/**
|
||||
* Rigourous Test :-)
|
||||
*/
|
||||
@Test
|
||||
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