* Fix issue #761: ThreadSafeDoubleCheckLocking.java: Instantiating by Reflection call will be successful if you do that firstly * Create leader election module * Create Interface of Instance and MessageManager * Create implementations with token ring algorithm * Change package structure. Create basic message system. * Implement heartbeat and heartbeat invoking message system * Implement election message handler * Add leader message handler * Add main entry point * Add comments * Update README.md * Fix checkstyle issue * Add Unit Tests * Add Unit Tests * Add bully leader selection * Change System.out to log print. Add MIT license in each file. * Add More java doc comments * Add unit test * Add unit tests * Add subclass-sandbox * Add Unit Test * Add Unit Test * Fix Typo * Move dependency into parent pom.xml * Change local valuable reference to be var
This commit is contained in:
		
							
								
								
									
										9
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								pom.xml
									
									
									
									
									
								
							@@ -60,6 +60,7 @@
 | 
			
		||||
        <jaxb-api.version>2.3.1</jaxb-api.version>
 | 
			
		||||
        <jaxb-impl.version>2.3.2</jaxb-impl.version>
 | 
			
		||||
        <annotation-api.version>1.3.2</annotation-api.version>
 | 
			
		||||
        <system-rules.version>1.19.0</system-rules.version>
 | 
			
		||||
    </properties>
 | 
			
		||||
    <modules>
 | 
			
		||||
        <module>abstract-factory</module>
 | 
			
		||||
@@ -180,8 +181,8 @@
 | 
			
		||||
        <module>bytecode</module>
 | 
			
		||||
        <module>leader-election</module>
 | 
			
		||||
        <module>data-locality</module>
 | 
			
		||||
        <module>subclass-sandbox</module>
 | 
			
		||||
        <module>circuit-breaker</module>
 | 
			
		||||
 | 
			
		||||
    </modules>
 | 
			
		||||
 | 
			
		||||
    <repositories>
 | 
			
		||||
@@ -317,6 +318,12 @@
 | 
			
		||||
                <artifactId>javassist</artifactId>
 | 
			
		||||
                <version>3.25.0-GA</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>com.github.stefanbirkner</groupId>
 | 
			
		||||
                <artifactId>system-rules</artifactId>
 | 
			
		||||
                <version>${system-rules.version}</version>
 | 
			
		||||
                <scope>test</scope>
 | 
			
		||||
            </dependency>
 | 
			
		||||
        </dependencies>
 | 
			
		||||
    </dependencyManagement>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										29
									
								
								subclass-sandbox/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								subclass-sandbox/README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
			
		||||
 | 
			
		||||
---  
 | 
			
		||||
layout: pattern  
 | 
			
		||||
title: Subclass Sandbox 
 | 
			
		||||
folder:  subclass-sandbox  
 | 
			
		||||
permalink: /patterns/subclass-sandbox/  
 | 
			
		||||
categories: Other  
 | 
			
		||||
tags:  
 | 
			
		||||
 - Java  
 | 
			
		||||
 - Difficulty-Beginner  
 | 
			
		||||
---  
 | 
			
		||||
  
 | 
			
		||||
## Intent  
 | 
			
		||||
The subclass sandbox pattern describes a basic idea, while not having a lot of detailed mechanics. You will need the pattern when you have several similar subclasses. If you have to make a tiny change, then change the base class, while all subclasses shouldn't have to be touched. So the base class has to be able to provide all of the operations a derived class needs to perform.
 | 
			
		||||
  
 | 
			
		||||
## Applicability  
 | 
			
		||||
The Subclass Sandbox pattern is a very simple, common pattern lurking in lots of codebases, even outside of games. If you have a non-virtual protected method laying around, you’re probably already using something like this. Subclass Sandbox is a good fit when:
 | 
			
		||||
 | 
			
		||||
-   You have a base class with a number of derived classes.
 | 
			
		||||
    
 | 
			
		||||
-   The base class is able to provide all of the operations that a derived class may need to perform.
 | 
			
		||||
    
 | 
			
		||||
-   There is behavioral overlap in the subclasses and you want to make it easier to share code between them.
 | 
			
		||||
    
 | 
			
		||||
-   You want to minimize coupling between those derived classes and the rest of the program.
 | 
			
		||||
  
 | 
			
		||||
## Credits  
 | 
			
		||||
  
 | 
			
		||||
* [Game Programming Patterns - Subclass Sandbox]([http://gameprogrammingpatterns.com/subclass-sandbox.html](http://gameprogrammingpatterns.com/subclass-sandbox.html))
 | 
			
		||||
							
								
								
									
										49
									
								
								subclass-sandbox/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								subclass-sandbox/pom.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,49 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!--
 | 
			
		||||
 | 
			
		||||
    The MIT License
 | 
			
		||||
    Copyright ? 2014 Ilkka Sepp?l?
 | 
			
		||||
 | 
			
		||||
    Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
    of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
    in the Software without restriction, including without limitation the rights
 | 
			
		||||
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
    copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
    furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
    The above copyright notice and this permission notice shall be included in
 | 
			
		||||
    all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
			
		||||
    THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
-->
 | 
			
		||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
 | 
			
		||||
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 | 
			
		||||
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 | 
			
		||||
    <parent>
 | 
			
		||||
        <artifactId>java-design-patterns</artifactId>
 | 
			
		||||
        <groupId>com.iluwatar</groupId>
 | 
			
		||||
        <version>1.22.0-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
    <modelVersion>4.0.0</modelVersion>
 | 
			
		||||
 | 
			
		||||
    <artifactId>subclass-sandbox</artifactId>
 | 
			
		||||
 | 
			
		||||
    <dependencies>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>junit</groupId>
 | 
			
		||||
            <artifactId>junit</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.github.stefanbirkner</groupId>
 | 
			
		||||
            <artifactId>system-rules</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
    </dependencies>
 | 
			
		||||
 | 
			
		||||
</project>
 | 
			
		||||
@@ -0,0 +1,53 @@
 | 
			
		||||
/**
 | 
			
		||||
 * The MIT License
 | 
			
		||||
 * Copyright (c) 2014-2016 Ilkka Seppälä
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 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:
 | 
			
		||||
 * <p>
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included in
 | 
			
		||||
 * all copies or substantial portions of the Software.
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 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.subclasssandbox;
 | 
			
		||||
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The subclass sandbox pattern describes a basic idea, while not having a lot
 | 
			
		||||
 * of detailed mechanics. You will need the pattern when you have several similar
 | 
			
		||||
 * subclasses. If you have to make a tiny change, then change the base class,
 | 
			
		||||
 * while all subclasses shouldn't have to be touched. So the base class has to be
 | 
			
		||||
 * able to provide all of the operations a derived class needs to perform.
 | 
			
		||||
 */
 | 
			
		||||
public class App {
 | 
			
		||||
 | 
			
		||||
  private static final Logger LOGGER = LoggerFactory.getLogger(App.class);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Entry point of the main program.
 | 
			
		||||
   * @param args Program runtime arguments.
 | 
			
		||||
   */
 | 
			
		||||
  public static void main(String[] args) {
 | 
			
		||||
    LOGGER.info("Use superpower: sky launch");
 | 
			
		||||
    var skyLaunch = new SkyLaunch();
 | 
			
		||||
    skyLaunch.activate();
 | 
			
		||||
    LOGGER.info("Use superpower: ground dive");
 | 
			
		||||
    var groundDive = new GroundDive();
 | 
			
		||||
    groundDive.activate();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,44 @@
 | 
			
		||||
/**
 | 
			
		||||
 * The MIT License
 | 
			
		||||
 * Copyright (c) 2014-2016 Ilkka Seppälä
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 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:
 | 
			
		||||
 * <p>
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included in
 | 
			
		||||
 * all copies or substantial portions of the Software.
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 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.subclasssandbox;
 | 
			
		||||
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * GroundDive superpower.
 | 
			
		||||
 */
 | 
			
		||||
public class GroundDive extends Superpower {
 | 
			
		||||
 | 
			
		||||
  public GroundDive() {
 | 
			
		||||
    super();
 | 
			
		||||
    logger = LoggerFactory.getLogger(GroundDive.class);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  protected void activate() {
 | 
			
		||||
    move(0, 0, -20);
 | 
			
		||||
    playSound("GROUNDDIVE_SOUND", 5);
 | 
			
		||||
    spawnParticles("GROUNDDIVE_PARTICLE", 20);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,44 @@
 | 
			
		||||
/**
 | 
			
		||||
 * The MIT License
 | 
			
		||||
 * Copyright (c) 2014-2016 Ilkka Seppälä
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 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:
 | 
			
		||||
 * <p>
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included in
 | 
			
		||||
 * all copies or substantial portions of the Software.
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 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.subclasssandbox;
 | 
			
		||||
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * SkyLaunch superpower.
 | 
			
		||||
 */
 | 
			
		||||
public class SkyLaunch extends Superpower {
 | 
			
		||||
 | 
			
		||||
  public SkyLaunch() {
 | 
			
		||||
    super();
 | 
			
		||||
    logger = LoggerFactory.getLogger(SkyLaunch.class);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  protected void activate() {
 | 
			
		||||
    move(0, 0, 20);
 | 
			
		||||
    playSound("SKYLAUNCH_SOUND", 1);
 | 
			
		||||
    spawnParticles("SKYLAUNCH_PARTICLE", 100);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,69 @@
 | 
			
		||||
/**
 | 
			
		||||
 * The MIT License
 | 
			
		||||
 * Copyright (c) 2014-2016 Ilkka Seppälä
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 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:
 | 
			
		||||
 * <p>
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included in
 | 
			
		||||
 * all copies or substantial portions of the Software.
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 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.subclasssandbox;
 | 
			
		||||
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Superpower abstract class. In this class the basic operations of all types of
 | 
			
		||||
 * superpowers are provided as protected methods.
 | 
			
		||||
 */
 | 
			
		||||
public abstract class Superpower {
 | 
			
		||||
 | 
			
		||||
  protected Logger logger;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Subclass of superpower should implement this sandbox method by calling the
 | 
			
		||||
   * methods provided in this super class.
 | 
			
		||||
   */
 | 
			
		||||
  protected abstract void activate();
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Move to (x, y, z).
 | 
			
		||||
   * @param x X coordinate.
 | 
			
		||||
   * @param y Y coordinate.
 | 
			
		||||
   * @param z Z coordinate.
 | 
			
		||||
   */
 | 
			
		||||
  protected void move(double x, double y, double z) {
 | 
			
		||||
    logger.info("Move to ( " + x + ", " + y + ", " + z + " )");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Play sound effect for the superpower.
 | 
			
		||||
   * @param soundName Sound name.
 | 
			
		||||
   * @param volumn Value of volumn.
 | 
			
		||||
   */
 | 
			
		||||
  protected void playSound(String soundName, int volumn) {
 | 
			
		||||
    logger.info("Play " + soundName + " with volumn " + volumn);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Spawn particles for the superpower.
 | 
			
		||||
   * @param particleType Particle type.
 | 
			
		||||
   * @param count Count of particles to be spawned.
 | 
			
		||||
   */
 | 
			
		||||
  protected void spawnParticles(String particleType, int count) {
 | 
			
		||||
    logger.info("Spawn " + count + " particle with type " + particleType);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,38 @@
 | 
			
		||||
/**
 | 
			
		||||
 * The MIT License
 | 
			
		||||
 * Copyright (c) 2014-2016 Ilkka Seppälä
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 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:
 | 
			
		||||
 * <p>
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included in
 | 
			
		||||
 * all copies or substantial portions of the Software.
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 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.subclasssandbox;
 | 
			
		||||
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * App unit tests.
 | 
			
		||||
 */
 | 
			
		||||
public class AppTest {
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testMain() {
 | 
			
		||||
    String[] args = {};
 | 
			
		||||
    App.main(args);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,92 @@
 | 
			
		||||
/**
 | 
			
		||||
 * The MIT License
 | 
			
		||||
 * Copyright (c) 2014-2016 Ilkka Seppälä
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 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:
 | 
			
		||||
 * <p>
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included in
 | 
			
		||||
 * all copies or substantial portions of the Software.
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 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.subclasssandbox;
 | 
			
		||||
 | 
			
		||||
import org.junit.Assert;
 | 
			
		||||
import org.junit.Rule;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
import org.junit.contrib.java.lang.system.SystemOutRule;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * GroundDive unit tests.
 | 
			
		||||
 */
 | 
			
		||||
public class GroundDiveTest {
 | 
			
		||||
 | 
			
		||||
  @Rule
 | 
			
		||||
  public SystemOutRule log = new SystemOutRule().enableLog();
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testMove() {
 | 
			
		||||
    log.clearLog();
 | 
			
		||||
    var groundDive = new GroundDive();
 | 
			
		||||
    groundDive.move(1.0, 1.0, 1.0);
 | 
			
		||||
    var outputLog = getLogContent(log.getLog());
 | 
			
		||||
    var expectedLog = "Move to ( 1.0, 1.0, 1.0 )";
 | 
			
		||||
    Assert.assertEquals(outputLog, expectedLog);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testPlaySound() {
 | 
			
		||||
    log.clearLog();
 | 
			
		||||
    var groundDive = new GroundDive();
 | 
			
		||||
    groundDive.playSound("SOUND_NAME", 1);
 | 
			
		||||
    var outputLog = getLogContent(log.getLog());
 | 
			
		||||
    var expectedLog = "Play SOUND_NAME with volumn 1";
 | 
			
		||||
    Assert.assertEquals(outputLog, expectedLog);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testSpawnParticles() {
 | 
			
		||||
    log.clearLog();
 | 
			
		||||
    var groundDive = new GroundDive();
 | 
			
		||||
    groundDive.spawnParticles("PARTICLE_TYPE", 100);
 | 
			
		||||
    final var outputLog = getLogContent(log.getLog());
 | 
			
		||||
    final var expectedLog = "Spawn 100 particle with type PARTICLE_TYPE";
 | 
			
		||||
    Assert.assertEquals(outputLog, expectedLog);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testActivate() {
 | 
			
		||||
    log.clearLog();
 | 
			
		||||
    var groundDive = new GroundDive();
 | 
			
		||||
    groundDive.activate();;
 | 
			
		||||
    String[] logs = log.getLog().split("\n");
 | 
			
		||||
    final var expectedSize = 3;
 | 
			
		||||
    final var log1 = logs[0].split("-")[1].trim() + " -" + logs[0].split("-")[2].trim();
 | 
			
		||||
    final var expectedLog1 = "Move to ( 0.0, 0.0, -20.0 )";
 | 
			
		||||
    final var log2 = getLogContent(logs[1]);
 | 
			
		||||
    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";
 | 
			
		||||
    Assert.assertEquals(logs.length, expectedSize);
 | 
			
		||||
    Assert.assertEquals(log1, expectedLog1);
 | 
			
		||||
    Assert.assertEquals(log2, expectedLog2);
 | 
			
		||||
    Assert.assertEquals(log3, expectedLog3);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private String getLogContent(String log) {
 | 
			
		||||
    return log.split("-")[1].trim();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,91 @@
 | 
			
		||||
/**
 | 
			
		||||
 * The MIT License
 | 
			
		||||
 * Copyright (c) 2014-2016 Ilkka Seppälä
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 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:
 | 
			
		||||
 * <p>
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included in
 | 
			
		||||
 * all copies or substantial portions of the Software.
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 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.subclasssandbox;
 | 
			
		||||
 | 
			
		||||
import org.junit.Assert;
 | 
			
		||||
import org.junit.Rule;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
import org.junit.contrib.java.lang.system.SystemOutRule;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * SkyLaunch unit tests.
 | 
			
		||||
 */
 | 
			
		||||
public class SkyLaunchTest {
 | 
			
		||||
 | 
			
		||||
  @Rule
 | 
			
		||||
  public SystemOutRule log = new SystemOutRule().enableLog();
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testMove() {
 | 
			
		||||
    log.clearLog();
 | 
			
		||||
    var skyLaunch = new SkyLaunch();
 | 
			
		||||
    skyLaunch.move(1.0, 1.0, 1.0);
 | 
			
		||||
    var outputLog = getLogContent(log.getLog());
 | 
			
		||||
    var expectedLog = "Move to ( 1.0, 1.0, 1.0 )";
 | 
			
		||||
    Assert.assertEquals(outputLog, expectedLog);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testPlaySound() {
 | 
			
		||||
    log.clearLog();
 | 
			
		||||
    var skyLaunch = new SkyLaunch();
 | 
			
		||||
    skyLaunch.playSound("SOUND_NAME", 1);
 | 
			
		||||
    var outputLog = getLogContent(log.getLog());
 | 
			
		||||
    var expectedLog = "Play SOUND_NAME with volumn 1";
 | 
			
		||||
    Assert.assertEquals(outputLog, expectedLog);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testSpawnParticles() {
 | 
			
		||||
    log.clearLog();
 | 
			
		||||
    var skyLaunch = new SkyLaunch();
 | 
			
		||||
    skyLaunch.spawnParticles("PARTICLE_TYPE", 100);
 | 
			
		||||
    var outputLog = getLogContent(log.getLog());
 | 
			
		||||
    var expectedLog = "Spawn 100 particle with type PARTICLE_TYPE";
 | 
			
		||||
    Assert.assertEquals(outputLog, expectedLog);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testActivate() {
 | 
			
		||||
    log.clearLog();
 | 
			
		||||
    var skyLaunch = new SkyLaunch();
 | 
			
		||||
    skyLaunch.activate();;
 | 
			
		||||
    String[] logs = log.getLog().split("\n");
 | 
			
		||||
    final var expectedSize = 3;
 | 
			
		||||
    final var log1 = getLogContent(logs[0]);
 | 
			
		||||
    final var expectedLog1 = "Move to ( 0.0, 0.0, 20.0 )";
 | 
			
		||||
    final var log2 = getLogContent(logs[1]);
 | 
			
		||||
    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";
 | 
			
		||||
    Assert.assertEquals(logs.length, expectedSize);
 | 
			
		||||
    Assert.assertEquals(log1, expectedLog1);
 | 
			
		||||
    Assert.assertEquals(log2, expectedLog2);
 | 
			
		||||
    Assert.assertEquals(log3, expectedLog3);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private String getLogContent(String log) {
 | 
			
		||||
    return log.split("-")[1].trim();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user