Compare commits

..

1 Commits

Author SHA1 Message Date
d98a3e5b4c Upgrade jacoco 2021-02-15 17:20:26 +02:00
100 changed files with 587 additions and 1355 deletions

View File

@ -1404,15 +1404,6 @@
"contributions": [
"translation"
]
},
{
"login": "richardmr36",
"name": "Martel Richard",
"avatar_url": "https://avatars.githubusercontent.com/u/19147333?v=4",
"profile": "https://github.com/richardmr36",
"contributions": [
"code"
]
}
],
"contributorsPerLine": 4,

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

@ -4,18 +4,18 @@
# Design patterns implemented in Java
![Java CI](https://github.com/iluwatar/java-design-patterns/workflows/Java%20CI/badge.svg)
![Java CI with Maven](https://github.com/iluwatar/java-design-patterns/workflows/Java%20CI%20with%20Maven/badge.svg)
[![License MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/iluwatar/java-design-patterns/master/LICENSE.md)
[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=iluwatar_java-design-patterns&metric=ncloc)](https://sonarcloud.io/dashboard?id=iluwatar_java-design-patterns)
[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=iluwatar_java-design-patterns&metric=coverage)](https://sonarcloud.io/dashboard?id=iluwatar_java-design-patterns)
[![Join the chat at https://gitter.im/iluwatar/java-design-patterns](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/iluwatar/java-design-patterns?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
[![All Contributors](https://img.shields.io/badge/all_contributors-155-orange.svg?style=flat-square)](#contributors-)
[![All Contributors](https://img.shields.io/badge/all_contributors-154-orange.svg?style=flat-square)](#contributors-)
<!-- ALL-CONTRIBUTORS-BADGE:END -->
<br/>
Read in different language : [![CN](/assets/flags/CN.png)**CN**](/zh/README.md), [![KR](/assets/flags/KR.png)**KR**](/ko/README.md), [![FR](/assets/flags/FR.png)**FR**](/fr/README.md), [![TR](/assets/flags/TR.png)**TR**](/tr/README.md), [![AR](/assets/flags/AR.png)**AR**](/ar/README.md)
Read in different language : [![CN](/assets/flags/CN.png)**CN**](/zh/README.md),[![KR](/assets/flags/KR.png)**KR**](/ko/README.md),[![FR](/assets/flags/FR.png)**FR**](/fr/README.md),[![TR](/assets/flags/TR.png)**TR**](/tr/README.md),[![AR](/assets/flags/AR.png)**AR**](/ar/README.md),
<br/>
@ -306,7 +306,6 @@ This project is licensed under the terms of the MIT license.
<tr>
<td align="center"><a href="https://github.com/byoungju94"><img src="https://avatars.githubusercontent.com/u/42516378?v=4?s=100" width="100px;" alt=""/><br /><sub><b>byoungju94</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=byoungju94" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/moustafafarhat"><img src="https://avatars.githubusercontent.com/u/38836727?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Moustafa Farhat</b></sub></a><br /><a href="#translation-moustafafarhat" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/richardmr36"><img src="https://avatars.githubusercontent.com/u/19147333?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Martel Richard</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=richardmr36" title="Code">💻</a></td>
</tr>
</table>

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

@ -1,138 +0,0 @@
---
layout: pattern
title: Parameter Object
folder: parameter-object
permalink: /patterns/parameter-object/
categories: Behavioral
tags:
- Extensibility
---
## Intent
The syntax of Java language doesnt allow you to declare a method with a predefined value
for a parameter. Probably the best option to achieve default method parameters in Java is
by using the method overloading. Method overloading allows you to declare several methods
with the same name but with a different number of parameters. But the main problem with
method overloading as a solution for default parameter values reveals itself when a method
accepts multiple parameters. Creating an overloaded method for each possible combination of
parameters might be cumbersome. To deal with this issue, the Parameter Object pattern is used.
## Explanation
The Parameter Object is simply a wrapper object for all parameters of a method.
It is nothing more than just a regular POJO. The advantage of the Parameter Object over a
regular method parameter list is the fact that class fields can have default values.
Once the wrapper class is created for the method parameter list, a corresponding builder class
is also created. Usually it's an inner static class. The final step is to use the builder
to construct a new parameter object. For those parameters that are skipped,
their default values are going to be used.
**Programmatic Example**
Here's the simple `SearchService` class where Method Overloading is used to default values here. To use method overloading, either the number of arguments or argument type has to be different.
```java
public class SearchService {
//Method Overloading example. SortOrder is defaulted in this method
public String search(String type, String sortBy) {
return getQuerySummary(type, sortBy, SortOrder.DESC);
}
/* Method Overloading example. SortBy is defaulted in this method. Note that the type has to be
different here to overload the method */
public String search(String type, SortOrder sortOrder) {
return getQuerySummary(type, "price", sortOrder);
}
private String getQuerySummary(String type, String sortBy, SortOrder sortOrder) {
return "Requesting shoes of type \"" + type + "\" sorted by \"" + sortBy + "\" in \""
+ sortOrder.getValue() + "ending\" order...";
}
}
```
Next we present the `SearchService` with `ParameterObject` created with Builder pattern.
```java
public class SearchService {
/* Parameter Object example. Default values are abstracted into the Parameter Object
at the time of Object creation */
public String search(ParameterObject parameterObject) {
return getQuerySummary(parameterObject.getType(), parameterObject.getSortBy(),
parameterObject.getSortOrder());
}
private String getQuerySummary(String type, String sortBy, SortOrder sortOrder) {
return "Requesting shoes of type \"" + type + "\" sorted by \"" + sortBy + "\" in \""
+ sortOrder.getValue() + "ending\" order...";
}
}
public class ParameterObject {
public static final String DEFAULT_SORT_BY = "price";
public static final SortOrder DEFAULT_SORT_ORDER = SortOrder.ASC;
private String type;
private String sortBy = DEFAULT_SORT_BY;
private SortOrder sortOrder = DEFAULT_SORT_ORDER;
private ParameterObject(Builder builder) {
type = builder.type;
sortBy = builder.sortBy != null && !builder.sortBy.isBlank() ? builder.sortBy : sortBy;
sortOrder = builder.sortOrder != null ? builder.sortOrder : sortOrder;
}
public static Builder newBuilder() {
return new Builder();
}
//Getters and Setters...
public static final class Builder {
private String type;
private String sortBy;
private SortOrder sortOrder;
private Builder() {
}
public Builder withType(String type) {
this.type = type;
return this;
}
public Builder sortBy(String sortBy) {
this.sortBy = sortBy;
return this;
}
public Builder sortOrder(SortOrder sortOrder) {
this.sortOrder = sortOrder;
return this;
}
public ParameterObject build() {
return new ParameterObject(this);
}
}
}
```
## Class diagram
![alt text](./etc/parameter-object.png "Parameter Object")
## Applicability
This pattern shows us the way to have default parameters for a method in Java as the language doesn't default parameters feature out of the box.
## Credits
- [Does Java have default parameters?](http://dolszewski.com/java/java-default-parameters)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 KiB

View File

@ -1,52 +0,0 @@
@startuml
package com.iluwatar.parameter.object {
class App {
- LOGGER : Logger {static}
+ App()
+ main(args : String[]) {static}
}
class ParameterObject {
+ DEFAULT_SORT_BY : String {static}
+ DEFAULT_SORT_ORDER : SortOrder {static}
- sortBy : String
- sortOrder : SortOrder
- type : String
- ParameterObject(builder : Builder)
+ getSortBy() : String
+ getSortOrder() : SortOrder
+ getType() : String
+ newBuilder() : Builder {static}
+ setSortBy(sortBy : String)
+ setSortOrder(sortOrder : SortOrder)
+ setType(type : String)
}
class Builder {
- sortBy : String
- sortOrder : SortOrder
- type : String
- Builder()
+ build() : ParameterObject
+ sortBy(sortBy : String) : Builder
+ sortOrder(sortOrder : SortOrder) : Builder
+ withType(type : String) : Builder
}
class SearchService {
+ SearchService()
- getQuerySummary(type : String, sortBy : String, sortOrder : SortOrder) : String
+ search(parameterObject : ParameterObject) : String
+ search(type : String, sortBy : String) : String
+ search(type : String, sortOrder : SortOrder) : String
}
enum SortOrder {
+ ASC {static}
+ DESC {static}
- value : String
+ getValue() : String
+ valueOf(name : String) : SortOrder {static}
+ values() : SortOrder[] {static}
}
}
Builder --> "-sortOrder" SortOrder
Builder ..+ ParameterObject
ParameterObject --> "-DEFAULT_SORT_ORDER" SortOrder
@enduml

View File

@ -1,61 +0,0 @@
<?xml version="1.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.
-->
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.iluwatar</groupId>
<artifactId>java-design-patterns</artifactId>
<version>1.24.0-SNAPSHOT</version>
</parent>
<artifactId>parameter-object</artifactId>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<configuration>
<archive>
<manifest>
<mainClass>com.iluwatar.parameter.object.App</mainClass>
</manifest>
</archive>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@ -1,62 +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.
*/
package com.iluwatar.parameter.object;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* The syntax of Java language doesnt allow you to declare a method with a predefined value
* for a parameter. Probably the best option to achieve default method parameters in Java is
* by using the method overloading. Method overloading allows you to declare several methods
* with the same name but with a different number of parameters. But the main problem with
* method overloading as a solution for default parameter values reveals itself when a method
* accepts multiple parameters. Creating an overloaded method for each possible combination of
* parameters might be cumbersome. To deal with this issue, the Parameter Object pattern is used.
* The Parameter Object is simply a wrapper object for all parameters of a method.
* It is nothing more than just a regular POJO. The advantage of the Parameter Object over a
* regular method parameter list is the fact that class fields can have default values.
* Once the wrapper class is created for the method parameter list, a corresponding builder class
* is also created. Usually it's an inner static class. The final step is to use the builder
* to construct a new parameter object. For those parameters that are skipped,
* their default values are going to be used.
*/
public class App {
private static final Logger LOGGER = LoggerFactory.getLogger(App.class);
/**
* Program entry point.
*
* @param args command line args
*/
public static void main(String[] args) {
ParameterObject params = ParameterObject.newBuilder()
.withType("sneakers")
.sortBy("brand")
.build();
LOGGER.info(params.toString());
LOGGER.info(new SearchService().search(params));
}
}

View File

@ -1,113 +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.
*/
package com.iluwatar.parameter.object;
public class ParameterObject {
/**
* Default values are defined here.
*/
public static final String DEFAULT_SORT_BY = "price";
public static final SortOrder DEFAULT_SORT_ORDER = SortOrder.ASC;
private String type;
/**
* Default values are assigned here.
*/
private String sortBy = DEFAULT_SORT_BY;
private SortOrder sortOrder = DEFAULT_SORT_ORDER;
/**
* Overriding default values on object creation only when builder object has a valid value.
*/
private ParameterObject(Builder builder) {
setType(builder.type);
setSortBy(builder.sortBy != null && !builder.sortBy.isBlank() ? builder.sortBy : sortBy);
setSortOrder(builder.sortOrder != null ? builder.sortOrder : sortOrder);
}
public static Builder newBuilder() {
return new Builder();
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getSortBy() {
return sortBy;
}
public void setSortBy(String sortBy) {
this.sortBy = sortBy;
}
public SortOrder getSortOrder() {
return sortOrder;
}
public void setSortOrder(SortOrder sortOrder) {
this.sortOrder = sortOrder;
}
@Override
public String toString() {
return String.format("ParameterObject[type='%s', sortBy='%s', sortOrder='%s']",
type, sortBy, sortOrder);
}
public static final class Builder {
private String type;
private String sortBy;
private SortOrder sortOrder;
private Builder() {
}
public Builder withType(String type) {
this.type = type;
return this;
}
public Builder sortBy(String sortBy) {
this.sortBy = sortBy;
return this;
}
public Builder sortOrder(SortOrder sortOrder) {
this.sortOrder = sortOrder;
return this;
}
public ParameterObject build() {
return new ParameterObject(this);
}
}
}

View File

@ -1,60 +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.
*/
package com.iluwatar.parameter.object;
public class SearchService {
/**
* Below two methods of name `search` is overloaded so that we can send a default value for
* one of the criteria and call the final api. A default SortOrder is sent in the first method
* and a default SortBy is sent in the second method. So two separate method definitions are
* needed for having default values for one argument in each case. Hence multiple overloaded
* methods are needed as the number of argument increases.
*/
public String search(String type, String sortBy) {
return getQuerySummary(type, sortBy, SortOrder.ASC);
}
public String search(String type, SortOrder sortOrder) {
return getQuerySummary(type, "price", sortOrder);
}
/**
* The need for multiple method definitions can be avoided by the Parameter Object pattern.
* Below is the example where only one method is required and all the logic for having default
* values are abstracted into the Parameter Object at the time of object creation.
*/
public String search(ParameterObject parameterObject) {
return getQuerySummary(parameterObject.getType(), parameterObject.getSortBy(),
parameterObject.getSortOrder());
}
private String getQuerySummary(String type, String sortBy, SortOrder sortOrder) {
return String.format("Requesting shoes of type \"%s\" sorted by \"%s\" in \"%sending\" order..",
type,
sortBy,
sortOrder.getValue());
}
}

View File

@ -1,39 +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.
*/
package com.iluwatar.parameter.object;
public enum SortOrder {
ASC("asc"),
DESC("desc");
private String value;
SortOrder(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}

View File

@ -1,41 +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.
*/
package com.iluwatar.parameter.object;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Application test
*/
class AppTest {
private static final Logger LOGGER = LoggerFactory.getLogger(AppTest.class);
@Test
void shouldExecuteApplicationWithoutException() {
App.main(new String[]{});
LOGGER.info("Executed successfully without exception.");
}
}

View File

@ -1,63 +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.
*/
package com.iluwatar.parameter.object;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static org.junit.jupiter.api.Assertions.assertEquals;
class ParameterObjectTest {
private static final Logger LOGGER = LoggerFactory.getLogger(ParameterObjectTest.class);
@Test
public void testForDefaultSortBy() {
//Creating parameter object with default value for SortBy set
ParameterObject params = ParameterObject.newBuilder()
.withType("sneakers")
.sortOrder(SortOrder.DESC)
.build();
assertEquals(ParameterObject.DEFAULT_SORT_BY, params.getSortBy(),
"Default SortBy is not set.");
LOGGER.info("{} Default parameter value is set during object creation as no value is passed."
, "SortBy");
}
@Test
public void testForDefaultSortOrder() {
//Creating parameter object with default value for SortOrder set
ParameterObject params = ParameterObject.newBuilder()
.withType("sneakers")
.sortBy("brand")
.build();
assertEquals(ParameterObject.DEFAULT_SORT_ORDER, params.getSortOrder(),
"Default SortOrder is not set.");
LOGGER.info("{} Default parameter value is set during object creation as no value is passed."
, "SortOrder");
}
}

View File

@ -1,63 +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.
*/
package com.iluwatar.parameter.object;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static org.junit.jupiter.api.Assertions.assertEquals;
class SearchServiceTest {
private static final Logger LOGGER = LoggerFactory.getLogger(SearchServiceTest.class);
private ParameterObject parameterObject;
private SearchService searchService;
@BeforeEach
public void setUp() {
//Creating parameter object with default values set
parameterObject = ParameterObject.newBuilder()
.withType("sneakers")
.build();
searchService = new SearchService();
}
/**
* Testing parameter object against the overloaded method to verify if the behaviour is same.
*/
@Test
public void testDefaultParametersMatch() {
assertEquals(searchService.search(parameterObject), searchService.search("sneakers",
SortOrder.ASC), "Default Parameter values do not not match.");
LOGGER.info("SortBy Default parameter value matches.");
assertEquals(searchService.search(parameterObject), searchService.search("sneakers",
"price"), "Default Parameter values do not not match.");
LOGGER.info("SortOrder Default parameter value matches.");
LOGGER.info("testDefaultParametersMatch executed successfully without errors.");
}
}

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);

11
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>
@ -208,7 +208,6 @@
<module>factory</module>
<module>separated-interface</module>
<module>special-case</module>
<module>parameter-object</module>
</modules>
<repositories>
@ -274,6 +273,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));
}
}