Compare commits

..

2 Commits

Author SHA1 Message Date
allcontributors[bot]
9db13920c1 docs: update .all-contributorsrc [skip ci] 2021-02-28 09:51:06 +00:00
allcontributors[bot]
a969ddb835 docs: update README.md [skip ci] 2021-02-28 09:51:05 +00:00
95 changed files with 592 additions and 657 deletions

View File

@@ -1,52 +0,0 @@
#
# The MIT License
# Copyright © 2014-2021 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.
#
version: 2
jobs:
sonar-pr:
docker:
- image: circleci/openjdk:11-node
steps:
- checkout
- restore_cache:
key: jdp-sonar-pr-{{ checksum "pom.xml" }}
- run: |
if [ -n "${CIRCLE_PR_NUMBER}" ]; then
MAVEN_OPTS="-Xmx3000m" xvfb-run ./mvnw -B clean verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar \
-Dsonar.pullrequest.key=${CIRCLE_PR_NUMBER} \
-Dsonar.pullrequest.branch=${CIRCLE_BRANCH} \
-Dsonar.pullrequest.base=master
else
echo "No Sonar PR analysis as this is not a pull request"
fi
- save_cache:
key: jdp-sonar-pr-{{ checksum "pom.xml" }}
paths:
- ~/.m2
workflows:
version: 2
all:
jobs:
- sonar-pr

View File

@@ -40,25 +40,25 @@ jobs:
steps:
- name: Checkout Code
uses: actions/checkout@master
uses: actions/checkout@v2
with:
# Disabling shallow clone for improving relevancy of SonarQube reporting
fetch-depth: 0
- name: Set up JDK 11
uses: actions/setup-java@master
uses: actions/setup-java@v1
with:
java-version: 11
- name: Cache SonarCloud packages
uses: actions/cache@master
uses: actions/cache@v2
with:
path: ~/.sonar/cache
key: ${{ runner.os }}-sonar
restore-keys: ${{ runner.os }}-sonar
- name: Cache Maven dependencies
uses: actions/cache@master
uses: actions/cache@v2
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
@@ -69,6 +69,9 @@ jobs:
- name: Install xvfb
run: sudo apt-get install -y xvfb
# The SonarQube analysis is only for the master branch of the main repository.
# SonarQube scan does not work for forked repositories try changing it to xvfb-run mvn clean verify
# See https://jira.sonarsource.com/browse/MMF-1371
- name: Build with Maven and run SonarQube analysis
run: xvfb-run ./mvnw clean verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar
env:

View File

@@ -29,7 +29,7 @@ name: Java PR Builder
on:
pull_request:
branches: [ master ]
types: [ opened, reopened, synchronize ]
types: [ opened, reopened, synchronize, labeled, unlabeled ]
jobs:
build:
@@ -38,15 +38,15 @@ jobs:
steps:
- name: Checkout Code
uses: actions/checkout@master
uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@master
uses: actions/setup-java@v1
with:
java-version: 11
- name: Cache Maven Dependecies
uses: actions/cache@master
uses: actions/cache@v2
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
@@ -57,5 +57,8 @@ jobs:
- name: Install xvfb
run: sudo apt-get install -y xvfb
# This worflow is only for building Pull Requests, the master branch runs Sonar analysis on the main repository.
# SonarQube scan does not work for forked repositories.
# See https://jira.sonarsource.com/browse/MMF-1371
- name: Build with Maven
run: xvfb-run ./mvnw clean verify

View File

@@ -1,26 +1,18 @@
/*
* The MIT License
* Copyright © 2014-2021 Ilkka Seppälä
* Copyright 2007-present the original author or authors.
*
* 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:
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.net.*;
import java.io.*;
import java.nio.channels.*;

View File

@@ -36,8 +36,8 @@
<artifactId>arrange-act-assert</artifactId>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

View File

@@ -23,11 +23,11 @@
package com.iluwatar.arrangeactassert;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.jupiter.api.Test;
import org.junit.Test;
/**
* Arrange/Act/Assert (AAA) is a pattern for organizing unit tests. It is a way to structure your
@@ -51,11 +51,10 @@ import org.junit.jupiter.api.Test;
* change and one reason to fail. In a large and complicated code base, tests that honor the single
* responsibility principle are much easier to troubleshoot.
*/
class CashAAATest {
public class CashAAATest {
@Test
void testPlus() {
public void testPlus() {
//Arrange
var cash = new Cash(3);
//Act
@@ -65,7 +64,7 @@ class CashAAATest {
}
@Test
void testMinus() {
public void testMinus() {
//Arrange
var cash = new Cash(8);
//Act
@@ -76,7 +75,7 @@ class CashAAATest {
}
@Test
void testInsufficientMinus() {
public void testInsufficientMinus() {
//Arrange
var cash = new Cash(1);
//Act
@@ -87,7 +86,7 @@ class CashAAATest {
}
@Test
void testUpdate() {
public void testUpdate() {
//Arrange
var cash = new Cash(5);
//Act

View File

@@ -23,24 +23,23 @@
package com.iluwatar.arrangeactassert;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.jupiter.api.Test;
import org.junit.Test;
/**
* ({@link CashAAATest}) is an anti-example of AAA pattern. This test is functionally correct, but
* with the addition of a new feature, it needs refactoring. There are an awful lot of steps in that
* with the addition of new feature, it needs refactoring. There are an awful lot of steps in that
* test method, but it verifies the class' important behavior in just eleven lines. It violates the
* single responsibility principle. If this test method failed after a small code change, it might
* take some digging to discover why.
*/
class CashAntiAAATest {
public class CashAntiAAATest {
@Test
void testCash() {
public void testCash() {
//initialize
var cash = new Cash(3);
//test plus

View File

@@ -45,6 +45,11 @@
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>

View File

@@ -34,6 +34,12 @@
<artifactId>combinator</artifactId>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>

View File

@@ -23,11 +23,11 @@
package com.iluwatar.combinator;
import org.junit.Test;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import org.junit.jupiter.api.Test;
class CombinatorAppTest {
public class CombinatorAppTest {
/**
* Issue: Add at least one assertion to this test case.
@@ -37,7 +37,7 @@ class CombinatorAppTest {
*/
@Test
void shouldExecuteApplicationWithoutException() {
public void shouldExecuteApplicationWithoutException() {
assertDoesNotThrow(() -> CombinatorApp.main(new String[]{}));
}
}
}

View File

@@ -23,19 +23,22 @@
package com.iluwatar.combinator;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.Assert;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import java.util.List;
class FinderTest {
import static org.junit.Assert.*;
public class FinderTest {
@Test
void contains() {
public void contains() {
var example = "the first one \nthe second one \n";
var result = Finder.contains("second").find(example);
assertEquals(1, result.size());
assertEquals("the second one ", result.get(0));
Assert.assertEquals(result.size(),1);
Assert.assertEquals(result.get(0),"the second one ");
}
}
}

View File

@@ -23,44 +23,44 @@
package com.iluwatar.combinator;
import static com.iluwatar.combinator.Finders.advancedFinder;
import static com.iluwatar.combinator.Finders.expandedFinder;
import static com.iluwatar.combinator.Finders.filteredFinder;
import static com.iluwatar.combinator.Finders.specializedFinder;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.Assert;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import java.util.List;
class FindersTest {
import static com.iluwatar.combinator.Finders.*;
import static org.junit.Assert.*;
public class FindersTest {
@Test
void advancedFinderTest() {
public void advancedFinderTest() {
var res = advancedFinder("it was","kingdom","sea").find(text());
assertEquals(1, res.size());
assertEquals("It was many and many a year ago,", res.get(0));
Assert.assertEquals(res.size(),1);
Assert.assertEquals(res.get(0),"It was many and many a year ago,");
}
@Test
void filteredFinderTest() {
public void filteredFinderTest() {
var res = filteredFinder(" was ", "many", "child").find(text());
assertEquals(1, res.size());
assertEquals("But we loved with a love that was more than love-", res.get(0));
Assert.assertEquals(res.size(),1);
Assert.assertEquals(res.get(0),"But we loved with a love that was more than love-");
}
@Test
void specializedFinderTest() {
public void specializedFinderTest() {
var res = specializedFinder("love","heaven").find(text());
assertEquals(1, res.size());
assertEquals("With a love that the winged seraphs of heaven", res.get(0));
Assert.assertEquals(res.size(),1);
Assert.assertEquals(res.get(0),"With a love that the winged seraphs of heaven");
}
@Test
void expandedFinderTest() {
public void expandedFinderTest() {
var res = expandedFinder("It was","kingdom").find(text());
assertEquals(3, res.size());
assertEquals("It was many and many a year ago,", res.get(0));
assertEquals("In a kingdom by the sea,", res.get(1));
assertEquals("In this kingdom by the sea;", res.get(2));
Assert.assertEquals(res.size(),3);
Assert.assertEquals(res.get(0),"It was many and many a year ago,");
Assert.assertEquals(res.get(1),"In a kingdom by the sea,");
Assert.assertEquals(res.get(2),"In this kingdom by the sea;");
}
@@ -80,4 +80,4 @@ class FindersTest {
+ "Coveted her and me.";
}
}
}

View File

@@ -23,8 +23,8 @@
package com.iluwatar.commander;
import java.security.SecureRandom;
import java.util.Hashtable;
import java.util.Random;
/**
* Order class holds details of the order.
@@ -45,7 +45,7 @@ public class Order { //can store all transactions ids also
public final String id;
final float price;
final long createdTime;
private static final SecureRandom RANDOM = new SecureRandom();
private static final Random RANDOM = new Random();
private static final String ALL_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
private static final Hashtable<String, Boolean> USED_IDS = new Hashtable<String, Boolean>();
PaymentStatus paid;

View File

@@ -23,10 +23,10 @@
package com.iluwatar.commander;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate;
@@ -56,7 +56,7 @@ public class Retry<T> {
void handleIssue(T obj, Exception e);
}
private static final SecureRandom RANDOM = new SecureRandom();
private static final Random RANDOM = new Random();
private final Operation op;
private final HandleErrorIssue<T> handleError;

View File

@@ -24,11 +24,10 @@
package com.iluwatar.commander;
import com.iluwatar.commander.exceptions.DatabaseUnavailableException;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.Random;
/**
* Service class is an abstract class extended by all services in this example. They all have a
@@ -43,7 +42,7 @@ public abstract class Service {
protected final Database database;
public ArrayList<Exception> exceptionsList;
private static final SecureRandom RANDOM = new SecureRandom();
private static final Random RANDOM = new Random();
private static final String ALL_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
private static final Hashtable<String, Boolean> USED_IDS = new Hashtable<>();

View File

@@ -36,6 +36,10 @@
<artifactId>double-buffer</artifactId>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>

View File

@@ -23,14 +23,14 @@
package com.iluwatar.doublebuffer;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
/**
* App unit test.
*/
class AppTest {
public class AppTest {
/**
* Issue: Add at least one assertion to this test case.
@@ -40,7 +40,7 @@ class AppTest {
*/
@Test
void shouldExecuteApplicationWithoutException() {
public void shouldExecuteApplicationWithoutException() {
assertDoesNotThrow(() -> App.main(new String[]{}));
}

View File

@@ -23,19 +23,17 @@
package com.iluwatar.doublebuffer;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;
import java.util.Arrays;
import org.junit.jupiter.api.Test;
import org.junit.Assert;
import org.junit.Test;
/**
* FrameBuffer unit test.
*/
class FrameBufferTest {
public class FrameBufferTest {
@Test
void testClearAll() {
public void testClearAll() {
try {
var field = FrameBuffer.class.getDeclaredField("pixels");
var pixels = new Pixel[FrameBuffer.HEIGHT * FrameBuffer.WIDTH];
@@ -45,14 +43,14 @@ class FrameBufferTest {
field.setAccessible(true);
field.set(frameBuffer, pixels);
frameBuffer.clearAll();
assertEquals(Pixel.WHITE, frameBuffer.getPixels()[0]);
Assert.assertEquals(Pixel.WHITE, frameBuffer.getPixels()[0]);
} catch (NoSuchFieldException | IllegalAccessException e) {
fail("Fail to modify field access.");
Assert.fail("Fail to modify field access.");
}
}
@Test
void testClear() {
public void testClear() {
try {
var field = FrameBuffer.class.getDeclaredField("pixels");
var pixels = new Pixel[FrameBuffer.HEIGHT * FrameBuffer.WIDTH];
@@ -62,21 +60,21 @@ class FrameBufferTest {
field.setAccessible(true);
field.set(frameBuffer, pixels);
frameBuffer.clear(0, 0);
assertEquals(Pixel.WHITE, frameBuffer.getPixels()[0]);
Assert.assertEquals(Pixel.WHITE, frameBuffer.getPixels()[0]);
} catch (NoSuchFieldException | IllegalAccessException e) {
fail("Fail to modify field access.");
Assert.fail("Fail to modify field access.");
}
}
@Test
void testDraw() {
public void testDraw() {
var frameBuffer = new FrameBuffer();
frameBuffer.draw(0, 0);
assertEquals(Pixel.BLACK, frameBuffer.getPixels()[0]);
Assert.assertEquals(Pixel.BLACK, frameBuffer.getPixels()[0]);
}
@Test
void testGetPixels() {
public void testGetPixels() {
try {
var field = FrameBuffer.class.getDeclaredField("pixels");
var pixels = new Pixel[FrameBuffer.HEIGHT * FrameBuffer.WIDTH];
@@ -85,9 +83,9 @@ class FrameBufferTest {
var frameBuffer = new FrameBuffer();
field.setAccessible(true);
field.set(frameBuffer, pixels);
assertEquals(pixels, frameBuffer.getPixels());
Assert.assertEquals(pixels, frameBuffer.getPixels());
} catch (NoSuchFieldException | IllegalAccessException e) {
fail("Fail to modify field access.");
Assert.fail("Fail to modify field access.");
}
}

View File

@@ -23,19 +23,17 @@
package com.iluwatar.doublebuffer;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;
import java.util.ArrayList;
import org.junit.jupiter.api.Test;
import org.junit.Assert;
import org.junit.Test;
/**
* Scene unit tests.
*/
class SceneTest {
public class SceneTest {
@Test
void testGetBuffer() {
public void testGetBuffer() {
try {
var scene = new Scene();
var field1 = Scene.class.getDeclaredField("current");
@@ -48,14 +46,14 @@ class SceneTest {
var field2 = Scene.class.getDeclaredField("frameBuffers");
field2.setAccessible(true);
field2.set(scene, frameBuffers);
assertEquals(frameBuffer, scene.getBuffer());
Assert.assertEquals(frameBuffer, scene.getBuffer());
} catch (NoSuchFieldException | IllegalAccessException e) {
fail("Fail to access private field.");
Assert.fail("Fail to access private field.");
}
}
@Test
void testDraw() {
public void testDraw() {
try {
var scene = new Scene();
var field1 = Scene.class.getDeclaredField("current");
@@ -65,10 +63,10 @@ class SceneTest {
field2.setAccessible(true);
field2.set(scene, 1);
scene.draw(new ArrayList<>());
assertEquals(1, field1.get(scene));
assertEquals(0, field2.get(scene));
Assert.assertEquals(1, field1.get(scene));
Assert.assertEquals(0, field2.get(scene));
} catch (NoSuchFieldException | IllegalAccessException e) {
fail("Fail to access private field");
Assert.fail("Fail to access private field");
}
}
}

View File

@@ -23,8 +23,8 @@
package com.iluwatar.event.asynchronous;
import java.security.SecureRandom;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
/**
@@ -43,7 +43,7 @@ public class EventManager implements ThreadCompleteListener {
public static final int MAX_ID = MAX_RUNNING_EVENTS;
public static final int MAX_EVENT_TIME = 1800; // in seconds / 30 minutes.
private int currentlyRunningSyncEvent = -1;
private final SecureRandom rand;
private final Random rand;
private final Map<Integer, Event> eventPool;
private static final String DOES_NOT_EXIST = " does not exist.";
@@ -52,7 +52,7 @@ public class EventManager implements ThreadCompleteListener {
* EventManager constructor.
*/
public EventManager() {
rand = new SecureRandom();
rand = new Random(1);
eventPool = new ConcurrentHashMap<Integer, Event>(MAX_RUNNING_EVENTS);
}

View File

@@ -38,6 +38,10 @@
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
<build>
<plugins>

View File

@@ -35,6 +35,11 @@
<artifactId>game-loop</artifactId>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>

View File

@@ -23,7 +23,7 @@
package com.iluwatar.gameloop;
import java.security.SecureRandom;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -80,7 +80,7 @@ public abstract class GameLoop {
*/
protected void processInput() {
try {
var lag = new SecureRandom().nextInt(200) + 50;
var lag = new Random().nextInt(200) + 50;
Thread.sleep(lag);
} catch (InterruptedException e) {
logger.error(e.getMessage());

View File

@@ -43,6 +43,11 @@
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>

View File

@@ -24,10 +24,10 @@
package com.iluwatar.hexagonal.domain;
import com.google.common.base.Joiner;
import java.security.SecureRandom;
import java.util.Collections;
import java.util.HashSet;
import java.util.PrimitiveIterator;
import java.util.Random;
import java.util.Set;
/**
@@ -126,7 +126,7 @@ public class LotteryNumbers {
* @param max the max value (inclusive)
*/
public RandomNumberGenerator(int min, int max) {
randomIterator = new SecureRandom().ints(min, max + 1).iterator();
randomIterator = new Random().ints(min, max + 1).iterator();
}
/**

View File

@@ -30,9 +30,9 @@ import com.iluwatar.hexagonal.domain.LotteryService;
import com.iluwatar.hexagonal.domain.LotteryTicket;
import com.iluwatar.hexagonal.domain.LotteryTicketId;
import com.iluwatar.hexagonal.domain.PlayerDetails;
import java.security.SecureRandom;
import java.util.AbstractMap.SimpleEntry;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
/**
@@ -41,7 +41,7 @@ import java.util.stream.Collectors;
public class SampleData {
private static final List<PlayerDetails> PLAYERS;
private static final SecureRandom RANDOM = new SecureRandom();
private static final Random RANDOM = new Random();
static {
PLAYERS = List.of(

View File

@@ -32,6 +32,11 @@
</parent>
<artifactId>leader-followers</artifactId>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>

View File

@@ -23,7 +23,7 @@
package com.iluwatar.leaderfollowers;
import java.security.SecureRandom;
import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
@@ -84,7 +84,7 @@ public class App {
* Add tasks.
*/
private static void addTasks(TaskSet taskSet) throws InterruptedException {
var rand = new SecureRandom();
var rand = new Random();
for (var i = 0; i < 5; i++) {
var time = Math.abs(rand.nextInt(1000));
taskSet.addTask(new Task(time));

View File

@@ -23,20 +23,20 @@
package com;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import com.iluwatar.leaderfollowers.App;
import org.junit.jupiter.api.Test;
import org.junit.Test;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
/**
*
* Application test
*
*/
class AppTest {
public class AppTest {
@Test
void shouldExecuteApplicationWithoutException() {
public void shouldExecuteApplicationWithoutException() {
assertDoesNotThrow(() -> App.main(new String[]{}));
}

View File

@@ -23,23 +23,22 @@
package com;
import static org.junit.jupiter.api.Assertions.assertTrue;
import com.iluwatar.leaderfollowers.Task;
import com.iluwatar.leaderfollowers.TaskHandler;
import org.junit.jupiter.api.Test;
import org.junit.Assert;
import org.junit.Test;
/**
* Tests for TaskHandler
*/
class TaskHandlerTest {
public class TaskHandlerTest {
@Test
void testHandleTask() throws InterruptedException {
public void testHandleTask() throws InterruptedException {
var taskHandler = new TaskHandler();
var handle = new Task(100);
taskHandler.handleTask(handle);
assertTrue(handle.isFinished());
Assert.assertTrue(handle.isFinished());
}
}

View File

@@ -23,31 +23,30 @@
package com;
import static org.junit.jupiter.api.Assertions.assertEquals;
import com.iluwatar.leaderfollowers.Task;
import com.iluwatar.leaderfollowers.TaskSet;
import org.junit.jupiter.api.Test;
import org.junit.Assert;
import org.junit.Test;
/**
* Tests for TaskSet
*/
class TaskSetTest {
public class TaskSetTest {
@Test
void testAddTask() throws InterruptedException {
public void testAddTask() throws InterruptedException {
var taskSet = new TaskSet();
taskSet.addTask(new Task(10));
assertEquals(1, taskSet.getSize());
Assert.assertTrue(taskSet.getSize() == 1);
}
@Test
void testGetTask() throws InterruptedException {
public void testGetTask() throws InterruptedException {
var taskSet = new TaskSet();
taskSet.addTask(new Task(100));
Task task = taskSet.getTask();
assertEquals(100, task.getTime());
assertEquals(0, taskSet.getSize());
Assert.assertTrue(task.getTime() == 100);
Assert.assertTrue(taskSet.getSize() == 0);
}
}

View File

@@ -23,45 +23,43 @@
package com;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import com.iluwatar.leaderfollowers.TaskHandler;
import com.iluwatar.leaderfollowers.TaskSet;
import com.iluwatar.leaderfollowers.WorkCenter;
import org.junit.jupiter.api.Test;
import org.junit.Assert;
import org.junit.Test;
/**
* Tests for WorkCenter
*/
class WorkCenterTest {
public class WorkCenterTest {
@Test
void testCreateWorkers() {
public void testCreateWorkers() {
var taskSet = new TaskSet();
var taskHandler = new TaskHandler();
var workCenter = new WorkCenter();
workCenter.createWorkers(5, taskSet, taskHandler);
assertEquals(5, workCenter.getWorkers().size());
assertEquals(workCenter.getWorkers().get(0), workCenter.getLeader());
Assert.assertEquals(workCenter.getWorkers().size(), 5);
Assert.assertEquals(workCenter.getWorkers().get(0), workCenter.getLeader());
}
@Test
void testNullLeader() {
public void testNullLeader() {
var workCenter = new WorkCenter();
workCenter.promoteLeader();
assertNull(workCenter.getLeader());
Assert.assertNull(workCenter.getLeader());
}
@Test
void testPromoteLeader() {
public void testPromoteLeader() {
var taskSet = new TaskSet();
var taskHandler = new TaskHandler();
var workCenter = new WorkCenter();
workCenter.createWorkers(5, taskSet, taskHandler);
workCenter.removeWorker(workCenter.getLeader());
workCenter.promoteLeader();
assertEquals(4, workCenter.getWorkers().size());
assertEquals(workCenter.getWorkers().get(0), workCenter.getLeader());
Assert.assertEquals(workCenter.getWorkers().size(), 4);
Assert.assertEquals(workCenter.getWorkers().get(0), workCenter.getLeader());
}
}

View File

@@ -21,18 +21,18 @@
* THE SOFTWARE.
*/
import org.junit.jupiter.api.Test;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.MatcherAssert.assertThat;
import org.junit.jupiter.api.Test;
/**
* Guard test
*/
class GuardTest {
public class GuardTest {
@Test
void testGuard() {
public void testGuard() {
var guard = new Guard();
assertThat(guard, instanceOf(Permission.class));
}

View File

@@ -23,7 +23,7 @@
package com.iluwatar.masterworker;
import java.security.SecureRandom;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -35,7 +35,7 @@ public class ArrayUtilityMethods {
private static final Logger LOGGER = LoggerFactory.getLogger(ArrayUtilityMethods.class);
private static final SecureRandom RANDOM = new SecureRandom();
private static final Random RANDOM = new Random();
/**
* Method arraysSame compares 2 arrays @param a1 and @param a2 and @return whether their values

36
mvnw.cmd vendored
View File

@@ -1,25 +1,21 @@
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM The MIT License
@REM Copyright © 2014-2021 Ilkka Seppälä
@REM
@REM Permission is hereby granted, free of charge, to any person obtaining a copy
@REM of this software and associated documentation files (the "Software"), to deal
@REM in the Software without restriction, including without limitation the rights
@REM to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
@REM copies of the Software, and to permit persons to whom the Software is
@REM furnished to do so, subject to the following conditions:
@REM
@REM The above copyright notice and this permission notice shall be included in
@REM all copies or substantial portions of the Software.
@REM
@REM THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
@REM IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
@REM FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@REM AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
@REM LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
@REM OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
@REM THE SOFTWARE.
@REM http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Maven Start Up Batch script

View File

@@ -2,7 +2,7 @@
<!--
The MIT License
Copyright © 2014-2021 Ilkka Seppälä
Copyright © 2014-2019 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

View File

@@ -1,6 +1,6 @@
/*
* The MIT License
* Copyright © 2014-2021 Ilkka Seppälä
* Copyright © 2014-2019 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

View File

@@ -1,6 +1,6 @@
/*
* The MIT License
* Copyright © 2014-2021 Ilkka Seppälä
* Copyright © 2014-2019 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

View File

@@ -1,6 +1,6 @@
/*
* The MIT License
* Copyright © 2014-2021 Ilkka Seppälä
* Copyright © 2014-2019 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

View File

@@ -1,6 +1,6 @@
/*
* The MIT License
* Copyright © 2014-2021 Ilkka Seppälä
* Copyright © 2014-2019 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

View File

@@ -1,6 +1,6 @@
/*
* The MIT License
* Copyright © 2014-2021 Ilkka Seppälä
* Copyright © 2014-2019 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

View File

@@ -1,6 +1,6 @@
/*
* The MIT License
* Copyright © 2014-2021 Ilkka Seppälä
* Copyright © 2014-2019 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

View File

@@ -1,6 +1,6 @@
/*
* The MIT License
* Copyright © 2014-2021 Ilkka Seppälä
* Copyright © 2014-2019 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

View File

@@ -35,6 +35,12 @@
<artifactId>partial-response</artifactId>
<dependencies>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>5.4.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>

View File

@@ -23,18 +23,17 @@
package com.iluwatar.partialresponse;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import java.util.Map;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Matchers;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.Map;
/**
* tests {@link VideoResource}.
*/
@@ -45,8 +44,8 @@ class VideoResourceTest {
private static VideoResource resource;
@BeforeEach
void setUp() {
@BeforeAll
static void setUp() {
var videos = Map.of(
1, new Video(1, "Avatar", 178, "epic science fiction film",
"James Cameron", "English"),
@@ -71,7 +70,7 @@ class VideoResourceTest {
var fields = new String[]{"id", "title", "length"};
var expectedDetails = "{\"id\": 1,\"title\": \"Avatar\",\"length\": 178}";
Mockito.when(fieldJsonMapper.toJson(any(Video.class), eq(fields))).thenReturn(expectedDetails);
Mockito.when(fieldJsonMapper.toJson(Matchers.any(Video.class), Matchers.eq(fields))).thenReturn(expectedDetails);
var actualFieldsDetails = resource.getDetails(2, fields);

10
pom.xml
View File

@@ -41,8 +41,8 @@
<spring-data.version>2.0.14.RELEASE</spring-data.version>
<h2.version>1.4.190</h2.version>
<junit.version>4.12</junit.version>
<junit-jupiter.version>5.7.1</junit-jupiter.version>
<junit-vintage.version>${junit-jupiter.version}</junit-vintage.version>
<junit-jupiter.version>5.5.2</junit-jupiter.version>
<junit-vintage.version>${junit.version}.2</junit-vintage.version>
<sping-test-junit5.version>1.0.2</sping-test-junit5.version>
<compiler.version>3.8.1</compiler.version>
<jacoco.version>0.8.6</jacoco.version>
@@ -274,6 +274,12 @@
<artifactId>camel-stream</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>

View File

@@ -23,7 +23,7 @@
package com.iluwatar.producer.consumer;
import java.security.SecureRandom;
import java.util.Random;
/**
* Class responsible for producing unit of work that can be expressed as {@link Item} and submitted
@@ -31,7 +31,7 @@ import java.security.SecureRandom;
*/
public class Producer {
private static final SecureRandom RANDOM = new SecureRandom();
private static final Random RANDOM = new Random();
private final ItemQueue queue;

View File

@@ -41,6 +41,10 @@
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
<build>

View File

@@ -34,6 +34,11 @@
<artifactId>role-object</artifactId>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>

View File

@@ -23,14 +23,14 @@
package com.iluwatar.roleobject;
import org.junit.Test;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import org.junit.jupiter.api.Test;
class ApplicationRoleObjectTest {
public class ApplicationRoleObjectTest {
@Test
void shouldExecuteApplicationWithoutException() {
public void shouldExecuteApplicationWithoutException() {
assertDoesNotThrow(() -> ApplicationRoleObject.main(new String[]{}));
}
}

View File

@@ -23,16 +23,15 @@
package com.iluwatar.roleobject;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.Assert;
import org.junit.Test;
import org.junit.jupiter.api.Test;
class BorrowerRoleTest {
public class BorrowerRoleTest {
@Test
void borrowTest() {
public void borrowTest() {
var borrowerRole = new BorrowerRole();
borrowerRole.setName("test");
assertEquals("Borrower test wants to get some money.", borrowerRole.borrow());
Assert.assertEquals(borrowerRole.borrow(), "Borrower test wants to get some money.");
}
}

View File

@@ -23,22 +23,22 @@
package com.iluwatar.roleobject;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.jupiter.api.Test;
import org.junit.Test;
class CustomerCoreTest {
public class CustomerCoreTest {
@Test
void addRole() {
public void addRole() {
var core = new CustomerCore();
assertTrue(core.addRole(Role.Borrower));
}
@Test
void hasRole() {
public void hasRole() {
var core = new CustomerCore();
core.addRole(Role.Borrower);
assertTrue(core.hasRole(Role.Borrower));
@@ -46,7 +46,7 @@ class CustomerCoreTest {
}
@Test
void remRole() {
public void remRole() {
var core = new CustomerCore();
core.addRole(Role.Borrower);
@@ -60,7 +60,7 @@ class CustomerCoreTest {
}
@Test
void getRole() {
public void getRole() {
var core = new CustomerCore();
core.addRole(Role.Borrower);
@@ -76,17 +76,17 @@ class CustomerCoreTest {
@Test
void toStringTest() {
public void toStringTest() {
var core = new CustomerCore();
core.addRole(Role.Borrower);
assertEquals("Customer{roles=[Borrower]}", core.toString());
assertEquals(core.toString(), "Customer{roles=[Borrower]}");
core = new CustomerCore();
core.addRole(Role.Investor);
assertEquals("Customer{roles=[Investor]}", core.toString());
assertEquals(core.toString(), "Customer{roles=[Investor]}");
core = new CustomerCore();
assertEquals("Customer{roles=[]}", core.toString());
assertEquals(core.toString(), "Customer{roles=[]}");
}

View File

@@ -23,17 +23,16 @@
package com.iluwatar.roleobject;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.Assert;
import org.junit.Test;
import org.junit.jupiter.api.Test;
class InvestorRoleTest {
public class InvestorRoleTest {
@Test
void investTest() {
public void investTest() {
var investorRole = new InvestorRole();
investorRole.setName("test");
investorRole.setAmountToInvest(10);
assertEquals("Investor test has invested 10 dollars", investorRole.invest());
Assert.assertEquals(investorRole.invest(), "Investor test has invested 10 dollars");
}
}

View File

@@ -23,17 +23,15 @@
package com.iluwatar.roleobject;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.Assert;
import org.junit.Test;
import org.junit.jupiter.api.Test;
class RoleTest {
public class RoleTest {
@Test
void instanceTest() {
public void instanceTest() {
var instance = Role.Borrower.instance();
assertTrue(instance.isPresent());
assertEquals(instance.get().getClass(), BorrowerRole.class);
Assert.assertTrue(instance.isPresent());
Assert.assertEquals(instance.get().getClass(), BorrowerRole.class);
}
}

View File

@@ -35,6 +35,11 @@
<artifactId>saga</artifactId>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>

View File

@@ -23,19 +23,18 @@
package com.iluwatar.saga.choreography;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import com.iluwatar.saga.orchestration.SagaApplication;
import org.junit.jupiter.api.Test;
import org.junit.Test;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
/***
* empty test
*/
class SagaApplicationTest {
public class SagaApplicationTest {
@Test
void shouldExecuteWithoutException() {
public void shouldExecuteWithoutException() {
assertDoesNotThrow(() -> SagaApplication.main(new String[]{}));
}
}
}

View File

@@ -23,25 +23,24 @@
package com.iluwatar.saga.choreography;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.Assert;
import org.junit.Test;
/**
* test to check choreography saga
*/
class SagaChoreographyTest {
public class SagaChoreographyTest {
@Test
void executeTest() {
public void executeTest() {
var sd = serviceDiscovery();
var service = sd.findAny();
var badOrderSaga = service.execute(newSaga("bad_order"));
var goodOrderSaga = service.execute(newSaga("good_order"));
assertEquals(Saga.SagaResult.ROLLBACKED, badOrderSaga.getResult());
assertEquals(Saga.SagaResult.FINISHED, goodOrderSaga.getResult());
Assert.assertEquals(badOrderSaga.getResult(), Saga.SagaResult.ROLLBACKED);
Assert.assertEquals(goodOrderSaga.getResult(), Saga.SagaResult.FINISHED);
}
private static Saga newSaga(Object value) {

View File

@@ -23,15 +23,15 @@
package com.iluwatar.saga.orchestration;
import org.junit.jupiter.api.Test;
import org.junit.Test;
/**
* empty test
*/
class SagaApplicationTest {
public class SagaApplicationTest {
@Test
void mainTest() {
public void mainTest() {
SagaApplication.main(new String[]{});
}
}
}

View File

@@ -23,30 +23,28 @@
package com.iluwatar.saga.orchestration;
import org.junit.jupiter.api.Test;
import static com.iluwatar.saga.orchestration.Saga.Result;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.ArrayList;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
/**
* test to test orchestration logic
*/
class SagaOrchestratorInternallyTest {
public class SagaOrchestratorInternallyTest {
private final List<String> records = new ArrayList<>();
@Test
void executeTest() {
public void executeTest() {
var sagaOrchestrator = new SagaOrchestrator(newSaga(), serviceDiscovery());
var result = sagaOrchestrator.execute(1);
assertEquals(Result.ROLLBACK, result);
assertArrayEquals(
new String[]{"+1", "+2", "+3", "+4", "-4", "-3", "-2", "-1"},
records.toArray(new String[]{}));
Assert.assertEquals(result, Result.ROLLBACK);
Assert.assertArrayEquals(
records.toArray(new String[]{}),
new String[]{"+1", "+2", "+3", "+4", "-4", "-3", "-2", "-1"});
}
private static Saga newSaga() {

View File

@@ -23,23 +23,22 @@
package com.iluwatar.saga.orchestration;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.Assert;
import org.junit.Test;
/**
* test to check general logic
*/
class SagaOrchestratorTest {
public class SagaOrchestratorTest {
@Test
void execute() {
public void execute() {
SagaOrchestrator sagaOrchestrator = new SagaOrchestrator(newSaga(), serviceDiscovery());
Saga.Result badOrder = sagaOrchestrator.execute("bad_order");
Saga.Result crashedOrder = sagaOrchestrator.execute("crashed_order");
assertEquals(Saga.Result.ROLLBACK, badOrder);
assertEquals(Saga.Result.CRASHED, crashedOrder);
Assert.assertEquals(badOrder, Saga.Result.ROLLBACK);
Assert.assertEquals(crashedOrder, Saga.Result.CRASHED);
}
private static Saga newSaga() {

View File

@@ -30,14 +30,17 @@ import static org.mockito.Mockito.when;
import com.amazonaws.services.lambda.runtime.Context;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
/**
* Unit tests for LambdaInfoApiHandler
*/
class LambdaInfoApiHandlerTest {
@RunWith(MockitoJUnitRunner.class)
public class LambdaInfoApiHandlerTest {
@Test
void handleRequestWithMockContext() {
public void handleRequestWithMockContext() {
var lambdaInfoApiHandler = new LambdaInfoApiHandler();
var context = mock(Context.class);
when(context.getAwsRequestId()).thenReturn("mock aws request id");

View File

@@ -36,6 +36,10 @@
<artifactId>sharding</artifactId>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>

View File

@@ -23,9 +23,9 @@
package com.iluwatar.sharding;
import java.security.SecureRandom;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -58,7 +58,7 @@ public class LookupShardManager extends ShardManager {
return lookupMap.get(key);
} else {
var shardCount = shardMap.size();
return new SecureRandom().nextInt(shardCount - 1) + 1;
return new Random().nextInt(shardCount - 1) + 1;
}
}

View File

@@ -23,17 +23,17 @@
package com.iluwatar.sharding;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
/**
* Unit tests for App class.
*/
class AppTest {
public class AppTest {
@Test
void shouldExecuteWithoutException() {
public void shouldExecuteWithoutException() {
assertDoesNotThrow(() -> App.main(new String[]{}));
}

View File

@@ -23,22 +23,22 @@
package com.iluwatar.sharding;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* Unit tests for HashShardManager class.
*/
class HashShardManagerTest {
public class HashShardManagerTest {
private HashShardManager hashShardManager;
/**
* Initialize hashShardManager instance.
*/
@BeforeEach
@Before
public void setup() {
hashShardManager = new HashShardManager();
var shard1 = new Shard(1);
@@ -49,11 +49,16 @@ class HashShardManagerTest {
hashShardManager.addNewShard(shard3);
}
@After
public void tearDown() {
}
@Test
void testStoreData() {
public void testStoreData() {
var data = new Data(1, "test", Data.DataType.TYPE_1);
hashShardManager.storeData(data);
assertEquals(data, hashShardManager.getShardById(1).getDataById(1));
Assert.assertEquals(data, hashShardManager.getShardById(1).getDataById(1));
}
}

View File

@@ -23,24 +23,22 @@
package com.iluwatar.sharding;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;
import java.util.Map;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* Unit tests for LookupShardManager class.
*/
class LookupShardManagerTest {
public class LookupShardManagerTest {
private LookupShardManager lookupShardManager;
/**
* Initialize lookupShardManager instance.
*/
@BeforeEach
@Before
public void setup() {
lookupShardManager = new LookupShardManager();
var shard1 = new Shard(1);
@@ -52,7 +50,7 @@ class LookupShardManagerTest {
}
@Test
void testStoreData() {
public void testStoreData() {
try {
var data = new Data(1, "test", Data.DataType.TYPE_1);
lookupShardManager.storeData(data);
@@ -61,9 +59,9 @@ class LookupShardManagerTest {
var lookupMap = (Map<Integer, Integer>) field.get(lookupShardManager);
var shardId = lookupMap.get(1);
var shard = lookupShardManager.getShardById(shardId);
assertEquals(data, shard.getDataById(1));
Assert.assertEquals(data, shard.getDataById(1));
} catch (NoSuchFieldException | IllegalAccessException e) {
fail("Fail to modify field access.");
Assert.fail("Fail to modify field access.");
}
}
}

View File

@@ -23,22 +23,21 @@
package com.iluwatar.sharding;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* Unit tests for RangeShardManager class.
*/
class RangeShardManagerTest {
public class RangeShardManagerTest {
private RangeShardManager rangeShardManager;
/**
* Initialize rangeShardManager instance.
*/
@BeforeEach
@Before
public void setup() {
rangeShardManager = new RangeShardManager();
var shard1 = new Shard(1);
@@ -50,10 +49,10 @@ class RangeShardManagerTest {
}
@Test
void testStoreData() {
public void testStoreData() {
var data = new Data(1, "test", Data.DataType.TYPE_1);
rangeShardManager.storeData(data);
assertEquals(data, rangeShardManager.getShardById(1).getDataById(1));
Assert.assertEquals(data, rangeShardManager.getShardById(1).getDataById(1));
}
}

View File

@@ -23,46 +23,49 @@
package com.iluwatar.sharding;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
import java.util.Map;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* Unit tests for ShardManager class.
*/
class ShardManagerTest {
public class ShardManagerTest {
private ShardManager shardManager;
/**
* Initialize shardManager instance.
*/
@BeforeEach
void setup() {
@Before
public void setup() {
shardManager = new TestShardManager();
}
@After
public void tearDown() {
}
@Test
void testAddNewShard() {
public void testAddNewShard() {
try {
var shard = new Shard(1);
shardManager.addNewShard(shard);
var field = ShardManager.class.getDeclaredField("shardMap");
field.setAccessible(true);
var map = (Map<Integer, Shard>) field.get(shardManager);
assertEquals(1, map.size());
assertEquals(shard, map.get(1));
Assert.assertEquals(1, map.size());
Assert.assertEquals(shard, map.get(1));
} catch (NoSuchFieldException | IllegalAccessException e) {
fail("Fail to modify field access.");
Assert.fail("Fail to modify field access.");
}
}
@Test
void testRemoveShardById() {
public void testRemoveShardById() {
try {
var shard = new Shard(1);
shardManager.addNewShard(shard);
@@ -70,19 +73,19 @@ class ShardManagerTest {
var field = ShardManager.class.getDeclaredField("shardMap");
field.setAccessible(true);
var map = (Map<Integer, Shard>) field.get(shardManager);
assertTrue(flag);
assertEquals(0, map.size());
Assert.assertEquals(true, flag);
Assert.assertEquals(0, map.size());
} catch (IllegalAccessException | NoSuchFieldException e) {
fail("Fail to modify field access.");
Assert.fail("Fail to modify field access.");
}
}
@Test
void testGetShardById() {
public void testGetShardById() {
var shard = new Shard(1);
shardManager.addNewShard(shard);
var tmpShard = shardManager.getShardById(1);
assertEquals(shard, tmpShard);
Assert.assertEquals(shard, tmpShard);
}
class TestShardManager extends ShardManager {

View File

@@ -23,47 +23,50 @@
package com.iluwatar.sharding;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;
import java.util.HashMap;
import java.util.Map;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* Unit tests for Shard class.
*/
class ShardTest {
public class ShardTest {
private Data data;
private Shard shard;
@BeforeEach
@Before
public void setup() {
data = new Data(1, "test", Data.DataType.TYPE_1);
shard = new Shard(1);
}
@After
public void tearDown() {
}
@Test
void testStoreData() {
public void testStoreData() {
try {
shard.storeData(data);
var field = Shard.class.getDeclaredField("dataStore");
field.setAccessible(true);
var dataMap = (Map<Integer, Data>) field.get(shard);
assertEquals(1, dataMap.size());
assertEquals(data, dataMap.get(1));
Assert.assertEquals(1, dataMap.size());
Assert.assertEquals(data, dataMap.get(1));
} catch (NoSuchFieldException | IllegalAccessException e) {
fail("Fail to modify field access.");
Assert.fail("Fail to modify field access.");
}
}
@Test
void testClearData() {
public void testClearData() {
try {
var dataMap = new HashMap<Integer, Data>();
dataMap.put(1, data);
@@ -72,9 +75,9 @@ class ShardTest {
field.set(shard, dataMap);
shard.clearData();
dataMap = (HashMap<Integer, Data>) field.get(shard);
assertEquals(0, dataMap.size());
Assert.assertEquals(0, dataMap.size());
} catch (NoSuchFieldException | IllegalAccessException e) {
fail("Fail to modify field access.");
Assert.fail("Fail to modify field access.");
}
}
}

View File

@@ -38,6 +38,10 @@
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
<build>
<plugins>

View File

@@ -23,17 +23,15 @@
package com.iluwatar.singleton;
import static org.junit.jupiter.api.Assertions.assertThrows;
import java.lang.reflect.InvocationTargetException;
import org.junit.jupiter.api.Test;
import org.junit.Test;
/**
* Date: 12/29/15 - 19:26 PM.
*
* @author Jeroen Meulemeester
*/
class ThreadSafeDoubleCheckLockingTest extends SingletonTest<ThreadSafeDoubleCheckLocking> {
public class ThreadSafeDoubleCheckLockingTest extends SingletonTest<ThreadSafeDoubleCheckLocking> {
/**
* Create a new singleton test instance using the given 'getInstance' method.
@@ -45,12 +43,12 @@ class ThreadSafeDoubleCheckLockingTest extends SingletonTest<ThreadSafeDoubleChe
/**
* Test creating new instance by refection.
*/
@Test
void testCreatingNewInstanceByRefection() throws Exception {
@Test(expected = InvocationTargetException.class)
public void testCreatingNewInstanceByRefection() throws Exception {
ThreadSafeDoubleCheckLocking.getInstance();
var constructor = ThreadSafeDoubleCheckLocking.class.getDeclaredConstructor();
constructor.setAccessible(true);
assertThrows(InvocationTargetException.class, () -> constructor.newInstance((Object[]) null));
constructor.newInstance((Object[]) null);
}
}

View File

@@ -23,8 +23,8 @@
package com.iluwatar.spatialpartition;
import java.security.SecureRandom;
import java.util.HashMap;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -112,7 +112,7 @@ public class App {
public static void main(String[] args) {
var bubbles1 = new HashMap<Integer, Bubble>();
var bubbles2 = new HashMap<Integer, Bubble>();
var rand = new SecureRandom();
var rand = new Random();
for (int i = 0; i < 10000; i++) {
var b = new Bubble(rand.nextInt(300), rand.nextInt(300), i, rand.nextInt(2) + 1);
bubbles1.put(i, b);

View File

@@ -23,9 +23,9 @@
package com.iluwatar.spatialpartition;
import java.security.SecureRandom;
import java.util.Collection;
import java.util.HashMap;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -36,7 +36,7 @@ import org.slf4j.LoggerFactory;
public class Bubble extends Point<Bubble> {
private static final Logger LOGGER = LoggerFactory.getLogger(Bubble.class);
private static final SecureRandom RANDOM = new SecureRandom();
private static final Random RANDOM = new Random();
final int radius;

View File

@@ -36,6 +36,10 @@
<artifactId>subclass-sandbox</artifactId>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>com.github.stefanbirkner</groupId>
<artifactId>system-lambda</artifactId>

View File

@@ -23,17 +23,17 @@
package com.iluwatar.subclasssandbox;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
/**
* App unit tests.
*/
class AppTest {
public class AppTest {
@Test
void shouldExecuteWithoutException() {
public void shouldExecuteWithoutException() {
assertDoesNotThrow(() -> App.main(new String[]{}));
}
}

View File

@@ -23,45 +23,45 @@
package com.iluwatar.subclasssandbox;
import static com.github.stefanbirkner.systemlambda.SystemLambda.tapSystemOutNormalized;
import static org.junit.jupiter.api.Assertions.assertEquals;
import com.github.stefanbirkner.systemlambda.Statement;
import org.junit.jupiter.api.Test;
import org.junit.Assert;
import org.junit.Test;
import static com.github.stefanbirkner.systemlambda.SystemLambda.tapSystemOutNormalized;
/**
* GroundDive unit tests.
*/
class GroundDiveTest {
public class GroundDiveTest {
@Test
void testMove() throws Exception {
public void testMove() throws Exception {
var groundDive = new GroundDive();
groundDive.move(1.0, 1.0, 1.0);
var outputLog = getLogContent(() -> groundDive.move(1.0, 1.0, 1.0));
var expectedLog = "Move to ( 1.0, 1.0, 1.0 )";
assertEquals(outputLog, expectedLog);
Assert.assertEquals(outputLog, expectedLog);
}
@Test
void testPlaySound() throws Exception {
public void testPlaySound() throws Exception {
var groundDive = new GroundDive();
var outputLog = getLogContent(() -> groundDive.playSound("SOUND_NAME", 1));
var expectedLog = "Play SOUND_NAME with volumn 1";
assertEquals(outputLog, expectedLog);
Assert.assertEquals(outputLog, expectedLog);
}
@Test
void testSpawnParticles() throws Exception {
public void testSpawnParticles() throws Exception {
var groundDive = new GroundDive();
final var outputLog = getLogContent(
() -> groundDive.spawnParticles("PARTICLE_TYPE", 100));
final var expectedLog = "Spawn 100 particle with type PARTICLE_TYPE";
assertEquals(outputLog, expectedLog);
Assert.assertEquals(outputLog, expectedLog);
}
@Test
void testActivate() throws Exception {
public void testActivate() throws Exception {
var groundDive = new GroundDive();
var logs = tapSystemOutNormalized(groundDive::activate)
.split("\n");
@@ -72,10 +72,10 @@ class GroundDiveTest {
final var expectedLog2 = "Play GROUNDDIVE_SOUND with volumn 5";
final var log3 = getLogContent(logs[2]);
final var expectedLog3 = "Spawn 20 particle with type GROUNDDIVE_PARTICLE";
assertEquals(logs.length, expectedSize);
assertEquals(log1, expectedLog1);
assertEquals(log2, expectedLog2);
assertEquals(log3, expectedLog3);
Assert.assertEquals(logs.length, expectedSize);
Assert.assertEquals(log1, expectedLog1);
Assert.assertEquals(log2, expectedLog2);
Assert.assertEquals(log3, expectedLog3);
}
private String getLogContent(Statement statement) throws Exception {

View File

@@ -23,44 +23,44 @@
package com.iluwatar.subclasssandbox;
import static com.github.stefanbirkner.systemlambda.SystemLambda.tapSystemOutNormalized;
import static org.junit.jupiter.api.Assertions.assertEquals;
import com.github.stefanbirkner.systemlambda.Statement;
import org.junit.jupiter.api.Test;
import org.junit.Assert;
import org.junit.Test;
import static com.github.stefanbirkner.systemlambda.SystemLambda.tapSystemOutNormalized;
/**
* SkyLaunch unit tests.
*/
class SkyLaunchTest {
public class SkyLaunchTest {
@Test
void testMove() throws Exception {
public void testMove() throws Exception {
var skyLaunch = new SkyLaunch();
var outputLog = getLogContent(() -> skyLaunch.move(1.0, 1.0, 1.0));
var expectedLog = "Move to ( 1.0, 1.0, 1.0 )";
assertEquals(outputLog, expectedLog);
Assert.assertEquals(outputLog, expectedLog);
}
@Test
void testPlaySound() throws Exception {
public void testPlaySound() throws Exception {
var skyLaunch = new SkyLaunch();
var outputLog = getLogContent(() -> skyLaunch.playSound("SOUND_NAME", 1));
var expectedLog = "Play SOUND_NAME with volumn 1";
assertEquals(outputLog, expectedLog);
Assert.assertEquals(outputLog, expectedLog);
}
@Test
void testSpawnParticles() throws Exception {
public void testSpawnParticles() throws Exception {
var skyLaunch = new SkyLaunch();
var outputLog = getLogContent(
() -> skyLaunch.spawnParticles("PARTICLE_TYPE", 100));
var expectedLog = "Spawn 100 particle with type PARTICLE_TYPE";
assertEquals(outputLog, expectedLog);
Assert.assertEquals(outputLog, expectedLog);
}
@Test
void testActivate() throws Exception {
public void testActivate() throws Exception {
var skyLaunch = new SkyLaunch();
var logs = tapSystemOutNormalized(skyLaunch::activate)
.split("\n");
@@ -71,10 +71,10 @@ class SkyLaunchTest {
final var expectedLog2 = "Play SKYLAUNCH_SOUND with volumn 1";
final var log3 = getLogContent(logs[2]);
final var expectedLog3 = "Spawn 100 particle with type SKYLAUNCH_PARTICLE";
assertEquals(logs.length, expectedSize);
assertEquals(log1, expectedLog1);
assertEquals(log2, expectedLog2);
assertEquals(log3, expectedLog3);
Assert.assertEquals(logs.length, expectedSize);
Assert.assertEquals(log1, expectedLog1);
Assert.assertEquals(log2, expectedLog2);
Assert.assertEquals(log3, expectedLog3);
}
private String getLogContent(Statement statement) throws Exception {

View File

@@ -38,6 +38,11 @@
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-migrationsupport</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>

View File

@@ -68,7 +68,7 @@ public final class RainbowFishSerializer {
var map = Map.of(
"name", rainbowFish.getName(),
"age", String.format("%d", rainbowFish.getAge()),
LENGTH_METERS, String.format("%d", rainbowFish.getLengthMeters()),
"lengthMeters", String.format("%d", rainbowFish.getLengthMeters()),
WEIGHT_TONS, String.format("%d", rainbowFish.getWeightTons()),
"angry", Boolean.toString(rainbowFish.getAngry()),
"hungry", Boolean.toString(rainbowFish.getHungry()),
@@ -95,7 +95,7 @@ public final class RainbowFishSerializer {
return new RainbowFish(
map.get("name"),
Integer.parseInt(map.get("age")),
Integer.parseInt(map.get(LENGTH_METERS)),
Integer.parseInt(map.get("lengthMeters")),
Integer.parseInt(map.get(WEIGHT_TONS))
);
}

View File

@@ -23,13 +23,14 @@
package com.iluwatar.tolerantreader;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import java.io.File;
import java.io.IOException;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
/**
* Application test
*/

View File

@@ -25,32 +25,26 @@ package com.iluwatar.tolerantreader;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotSame;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.nio.file.Files;
import java.nio.file.Path;
import org.junit.jupiter.api.BeforeEach;
import java.io.File;
import org.junit.Rule;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import org.junit.jupiter.migrationsupport.rules.EnableRuleMigrationSupport;
import org.junit.rules.TemporaryFolder;
/**
* Date: 12/30/15 - 18:39 PM
*
* @author Jeroen Meulemeester
*/
class RainbowFishSerializerTest {
@EnableRuleMigrationSupport
public class RainbowFishSerializerTest {
/**
* Create a temporary folder, used to generate files in during this test
*/
@TempDir
static Path testFolder;
@BeforeEach
void beforeEach() {
assertTrue(Files.isDirectory(testFolder));
}
@Rule
public final TemporaryFolder testFolder = new TemporaryFolder();
/**
* Rainbow fish version 1 used during the tests
@@ -66,11 +60,11 @@ class RainbowFishSerializerTest {
* Verify if a fish, written as version 1 can be read back as version 1
*/
@Test
void testWriteV1ReadV1() throws Exception {
final var outputPath = Files.createFile(testFolder.resolve("outputFile"));
RainbowFishSerializer.writeV1(V1, outputPath.toString());
public void testWriteV1ReadV1() throws Exception {
final var outputFile = this.testFolder.newFile();
RainbowFishSerializer.writeV1(V1, outputFile.getPath());
final var fish = RainbowFishSerializer.readV1(outputPath.toString());
final var fish = RainbowFishSerializer.readV1(outputFile.getPath());
assertNotSame(V1, fish);
assertEquals(V1.getName(), fish.getName());
assertEquals(V1.getAge(), fish.getAge());
@@ -83,11 +77,11 @@ class RainbowFishSerializerTest {
* Verify if a fish, written as version 2 can be read back as version 1
*/
@Test
void testWriteV2ReadV1() throws Exception {
final var outputPath = Files.createFile(testFolder.resolve("outputFile2"));
RainbowFishSerializer.writeV2(V2, outputPath.toString());
public void testWriteV2ReadV1() throws Exception {
final var outputFile = this.testFolder.newFile();
RainbowFishSerializer.writeV2(V2, outputFile.getPath());
final var fish = RainbowFishSerializer.readV1(outputPath.toString());
final var fish = RainbowFishSerializer.readV1(outputFile.getPath());
assertNotSame(V2, fish);
assertEquals(V2.getName(), fish.getName());
assertEquals(V2.getAge(), fish.getAge());
@@ -95,4 +89,4 @@ class RainbowFishSerializerTest {
assertEquals(V2.getWeightTons(), fish.getWeightTons());
}
}
}

View File

@@ -23,22 +23,22 @@
package com.iluwatar.tolerantreader;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.Assert.assertEquals;
import org.junit.jupiter.api.Test;
import org.junit.Test;
/**
* Date: 12/30/15 - 18:34 PM
*
* @author Jeroen Meulemeester
*/
class RainbowFishTest {
public class RainbowFishTest {
/**
* Verify if the getters of a {@link RainbowFish} return the expected values
*/
@Test
void testValues() {
public void testValues() {
final var fish = new RainbowFish("name", 1, 2, 3);
assertEquals("name", fish.getName());
assertEquals(1, fish.getAge());

View File

@@ -27,20 +27,20 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Test;
import org.junit.Test;
/**
* Date: 12/30/15 - 18:35 PM
*
* @author Jeroen Meulemeester
*/
class RainbowFishV2Test {
public class RainbowFishV2Test {
/**
* Verify if the getters of a {@link RainbowFish} return the expected values
*/
@Test
void testValues() {
public void testValues() {
final var fish = new RainbowFishV2("name", 1, 2, 3, false, true, false);
assertEquals("name", fish.getName());
assertEquals(1, fish.getAge());

View File

@@ -1,87 +0,0 @@
---
layout: pattern
title: Singleton
folder: singleton
permalink: /patterns/singleton/
categories: Creational
tags:
- Gang of Four
---
## Amaç
Bir sınıfın yalnızca bir örneğine sahip olduğundan emin olun ve ona global bir erişim noktası sağlayın.
## Açıklama
Örnek
> Büyücülerin büyülerini çalıstıkları tek bir fildişi kule olabilir. Aynı büyülü fildişi kule,
> büyücüler tarafından her zaman kullanılır. Buradaki fildişi kulesi singleton tasarım desenine örnektir.
Özetle
> Belirli bir sınıftan yalnızca bir nesnenin oluşturulmasını sağlar.
Wikipedia açıklaması
> Yazılım mühendisliğinde, tekil desen, bir sınıfın somutlaştırılmasını tek bir nesneyle sınırlayan
> bir yazılım tasarım modelidir.Bu,sistemdeki eylemleri koordine etmek için
> tam olarak bir nesne gerektiğinde kullanışlıdır.
**Örnek**
Joshua Bloch, Effective Java 2nd Edition p.18
> Enum singleton tasarım desenini uygulamak için en iyi yoldur.
```java
public enum EnumIvoryTower {
INSTANCE
}
```
Tanımladıktan sonra kullanmak için:
```java
var enumIvoryTower1 = EnumIvoryTower.INSTANCE;
var enumIvoryTower2 = EnumIvoryTower.INSTANCE;
assertEquals(enumIvoryTower1, enumIvoryTower2); // true
```
## Sınıf diagramı
![alt text](https://github.com/iluwatar/java-design-patterns/blob/master/singleton/etc/singleton.urm.png)
## Uygulanabilirlik
Singleton tasarım deseni şu durumlarda kullanılmalıdır
* Bir sınıfın tam olarak bir örneği olmalı ve iyi bilinen bir erişim noktasından istemciler tarafından erişilebilir olmalıdır.
* Tek örnek alt sınıflandırma yoluyla genişletilebilir olduğunda ve istemciler, kodlarını değiştirmeden genişletilmiş bir örnek kullanabilmelidir
## Use Case
* Logging sınıflarında
* Database bağlantılarını yönetmek için
* File manager
## Gerçek dünya örnekleri
* [java.lang.Runtime#getRuntime()](http://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#getRuntime%28%29)
* [java.awt.Desktop#getDesktop()](http://docs.oracle.com/javase/8/docs/api/java/awt/Desktop.html#getDesktop--)
* [java.lang.System#getSecurityManager()](http://docs.oracle.com/javase/8/docs/api/java/lang/System.html#getSecurityManager--)
## Sonuçlar
* Kendi yaratımını ve yaşam döngüsünü kontrol ederek Tek Sorumluluk İlkesini (SRP) ihlal ediyor.
* Bu nesne tarafından kullanılan bir nesnenin ve kaynakların serbest bırakılmasını önleyen global bir paylaşılan örnek kullanmayı teşvik eder.
* Birbirine sıkı bağlı kod oluşturur. Singleton tasarım deseni kullanan istemci sınıflarını test etmek zorlaşır.
* Bir Singleton tasarım deseninden alt sınıflar oluşturmak neredeyse imkansız hale gelir.
## Credits
* [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59)
* [Effective Java](https://www.amazon.com/gp/product/0134685997/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0134685997&linkCode=as2&tag=javadesignpat-20&linkId=4e349f4b3ff8c50123f8147c828e53eb)
* [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b)
* [Refactoring to Patterns](https://www.amazon.com/gp/product/0321213351/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321213351&linkCode=as2&tag=javadesignpat-20&linkId=2a76fcb387234bc71b1c61150b3cc3a7)

View File

@@ -98,7 +98,7 @@ public interface Trampoline<T> {
return trampoline(this);
}
T trampoline(final Trampoline<T> trampoline) {
private T trampoline(final Trampoline<T> trampoline) {
return Stream.iterate(trampoline, Trampoline::jump)
.filter(Trampoline::complete)
.findFirst()

View File

@@ -26,9 +26,9 @@ package com.iluwatar.typeobject;
import com.iluwatar.typeobject.Candy.Type;
import java.io.IOException;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import org.json.simple.parser.ParseException;
/**
@@ -38,7 +38,7 @@ import org.json.simple.parser.ParseException;
*/
public class CellPool {
private static final SecureRandom RANDOM = new SecureRandom();
private static final Random RANDOM = new Random();
public static final String FRUIT = "fruit";
public static final String CANDY = "candy";
List<Cell> pool;

View File

@@ -35,9 +35,19 @@
<artifactId>unit-of-work</artifactId>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.0.0</version>
<scope>test</scope>
</dependency>
<dependency>

View File

@@ -23,17 +23,17 @@
package com.iluwatar.unitofwork;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
/**
* AppTest
*/
class AppTest {
public class AppTest {
@Test
void shouldExecuteWithoutException() {
public void shouldExecuteWithoutException() {
assertDoesNotThrow(() -> App.main(new String[]{}));
}
}

View File

@@ -23,32 +23,43 @@
package com.iluwatar.unitofwork;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.mock;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.verifyZeroInteractions;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.jupiter.api.Test;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
/**
* tests {@link StudentRepository}
*/
class StudentRepositoryTest {
@RunWith(MockitoJUnitRunner.class)
public class StudentRepositoryTest {
private final Student student1 = new Student(1, "Ram", "street 9, cupertino");
private final Student student2 = new Student(1, "Sham", "Z bridge, pune");
private final Map<String, List<Student>> context = new HashMap<>();
private final StudentDatabase studentDatabase = mock(StudentDatabase.class);
private final StudentRepository studentRepository = new StudentRepository(context, studentDatabase);;
private Map<String, List<Student>> context;
@Mock
private StudentDatabase studentDatabase;
private StudentRepository studentRepository;
@Before
public void setUp() {
context = new HashMap<>();
studentRepository = new StudentRepository(context, studentDatabase);
}
@Test
void shouldSaveNewStudentWithoutWritingToDb() {
public void shouldSaveNewStudentWithoutWritingToDb() {
studentRepository.registerNew(student1);
studentRepository.registerNew(student2);
@@ -57,7 +68,7 @@ class StudentRepositoryTest {
}
@Test
void shouldSaveDeletedStudentWithoutWritingToDb() {
public void shouldSaveDeletedStudentWithoutWritingToDb() {
studentRepository.registerDeleted(student1);
studentRepository.registerDeleted(student2);
@@ -66,7 +77,7 @@ class StudentRepositoryTest {
}
@Test
void shouldSaveModifiedStudentWithoutWritingToDb() {
public void shouldSaveModifiedStudentWithoutWritingToDb() {
studentRepository.registerModified(student1);
studentRepository.registerModified(student2);
@@ -75,7 +86,7 @@ class StudentRepositoryTest {
}
@Test
void shouldSaveAllLocalChangesToDb() {
public void shouldSaveAllLocalChangesToDb() {
context.put(UnitActions.INSERT.getActionValue(), List.of(student1));
context.put(UnitActions.MODIFY.getActionValue(), List.of(student1));
context.put(UnitActions.DELETE.getActionValue(), List.of(student1));
@@ -88,7 +99,7 @@ class StudentRepositoryTest {
}
@Test
void shouldNotWriteToDbIfContextIsNull() {
public void shouldNotWriteToDbIfContextIsNull() {
var studentRepository = new StudentRepository(null, studentDatabase);
studentRepository.commit();
@@ -97,16 +108,16 @@ class StudentRepositoryTest {
}
@Test
void shouldNotWriteToDbIfNothingToCommit() {
public void shouldNotWriteToDbIfNothingToCommit() {
var studentRepository = new StudentRepository(new HashMap<>(), studentDatabase);
studentRepository.commit();
verifyNoMoreInteractions(studentDatabase);
verifyZeroInteractions(studentDatabase);
}
@Test
void shouldNotInsertToDbIfNoRegisteredStudentsToBeCommitted() {
public void shouldNotInsertToDbIfNoRegisteredStudentsToBeCommitted() {
context.put(UnitActions.MODIFY.getActionValue(), List.of(student1));
context.put(UnitActions.DELETE.getActionValue(), List.of(student1));
@@ -116,7 +127,7 @@ class StudentRepositoryTest {
}
@Test
void shouldNotModifyToDbIfNotRegisteredStudentsToBeCommitted() {
public void shouldNotModifyToDbIfNotRegisteredStudentsToBeCommitted() {
context.put(UnitActions.INSERT.getActionValue(), List.of(student1));
context.put(UnitActions.DELETE.getActionValue(), List.of(student1));
@@ -126,7 +137,7 @@ class StudentRepositoryTest {
}
@Test
void shouldNotDeleteFromDbIfNotRegisteredStudentsToBeCommitted() {
public void shouldNotDeleteFromDbIfNotRegisteredStudentsToBeCommitted() {
context.put(UnitActions.INSERT.getActionValue(), List.of(student1));
context.put(UnitActions.MODIFY.getActionValue(), List.of(student1));
@@ -134,4 +145,4 @@ class StudentRepositoryTest {
verify(studentDatabase, never()).delete(student1);
}
}
}

View File

@@ -35,6 +35,10 @@
<artifactId>update-method</artifactId>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>

View File

@@ -23,9 +23,9 @@
package com.iluwatar.updatemethod;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -66,7 +66,7 @@ public class World {
*/
private void processInput() {
try {
int lag = new SecureRandom().nextInt(200) + 50;
int lag = new Random().nextInt(200) + 50;
Thread.sleep(lag);
} catch (InterruptedException e) {
LOGGER.error(e.getMessage());

View File

@@ -23,14 +23,14 @@
package com.iluwatar.updatemethod;
import org.junit.jupiter.api.Test;
import org.junit.Test;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
class AppTest {
public class AppTest {
@Test
void shouldExecuteApplicationWithoutException() {
public void shouldExecuteApplicationWithoutException() {
assertDoesNotThrow(() -> App.main(new String[]{}));
}
}

View File

@@ -23,60 +23,56 @@
package com.iluwatar.updatemethod;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class SkeletonTest {
private Skeleton skeleton;
class SkeletonTest {
private static Skeleton skeleton;
@BeforeAll
public static void setup() {
@Before
public void setup() {
skeleton = new Skeleton(1);
}
@AfterAll
public static void tearDown() {
@After
public void tearDown() {
skeleton = null;
}
@Test
void testUpdateForPatrollingLeft() {
public void testUpdateForPatrollingLeft() {
skeleton.patrollingLeft = true;
skeleton.setPosition(50);
skeleton.update();
assertEquals(49, skeleton.getPosition());
Assert.assertEquals(49, skeleton.getPosition());
}
@Test
void testUpdateForPatrollingRight() {
public void testUpdateForPatrollingRight() {
skeleton.patrollingLeft = false;
skeleton.setPosition(50);
skeleton.update();
assertEquals(51, skeleton.getPosition());
Assert.assertEquals(51, skeleton.getPosition());
}
@Test
void testUpdateForReverseDirectionFromLeftToRight() {
public void testUpdateForReverseDirectionFromLeftToRight() {
skeleton.patrollingLeft = true;
skeleton.setPosition(1);
skeleton.update();
assertEquals(0, skeleton.getPosition());
assertFalse(skeleton.patrollingLeft);
Assert.assertEquals(0, skeleton.getPosition());
Assert.assertEquals(false, skeleton.patrollingLeft);
}
@Test
void testUpdateForReverseDirectionFromRightToLeft() {
public void testUpdateForReverseDirectionFromRightToLeft() {
skeleton.patrollingLeft = false;
skeleton.setPosition(99);
skeleton.update();
assertEquals(100, skeleton.getPosition());
assertTrue(skeleton.patrollingLeft);
Assert.assertEquals(100, skeleton.getPosition());
Assert.assertEquals(true, skeleton.patrollingLeft);
}
}

View File

@@ -23,37 +23,36 @@
package com.iluwatar.updatemethod;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class StatueTest {
class StatueTest {
private Statue statue;
private static Statue statue;
@BeforeAll
public static void setup() {
@Before
public void setup() {
statue = new Statue(1, 20);
}
@AfterAll
public static void tearDown() {
@After
public void tearDown() {
statue = null;
}
@Test
void testUpdateForPendingShoot() {
public void testUpdateForPendingShoot() {
statue.frames = 10;
statue.update();
assertEquals(11, statue.frames);
Assert.assertEquals(11, statue.frames);
}
@Test
void testUpdateForShooting() {
public void testUpdateForShooting() {
statue.frames = 19;
statue.update();
assertEquals(0, statue.frames);
Assert.assertEquals(0, statue.frames);
}
}

View File

@@ -23,44 +23,41 @@
package com.iluwatar.updatemethod;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class WorldTest {
class WorldTest {
private World world;
private static World world;
@BeforeAll
public static void setup() {
@Before
public void setup() {
world = new World();
}
@AfterAll
public static void tearDown() {
@After
public void tearDown() {
world = null;
}
@Test
void testRun() {
public void testRun() {
world.run();
assertTrue(world.isRunning);
Assert.assertEquals(true, world.isRunning);
}
@Test
void testStop() {
public void testStop() {
world.stop();
assertFalse(world.isRunning);
Assert.assertEquals(false, world.isRunning);
}
@Test
void testAddEntity() {
public void testAddEntity() {
var entity = new Skeleton(1);
world.addEntity(entity);
assertEquals(entity, world.entities.get(0));
Assert.assertEquals(entity, world.entities.get(0));
}
}