Compare commits

...

5 Commits

Author SHA1 Message Date
md_5
497c6879e0
Add (hopefully temporary) queue for plugin messages to server 2023-09-24 06:50:46 +10:00
md_5
7b27dfaf5e
#3522: Revert "#3518: Bump io.netty:netty-bom from 4.1.97.Final to 4.1.98.Final"
This reverts commit f486a251f3.
2023-09-24 06:25:28 +10:00
md_5
f9b75c4a3a
Update tests to JUnit 5 2023-09-23 18:44:14 +10:00
md_5
0509303fd3
#3519: Queue configuration phase packets from API methods 2023-09-23 10:29:09 +10:00
dependabot[bot]
f486a251f3
#3518: Bump io.netty:netty-bom from 4.1.97.Final to 4.1.98.Final
Bumps [io.netty:netty-bom](https://github.com/netty/netty) from 4.1.97.Final to 4.1.98.Final.
- [Commits](https://github.com/netty/netty/compare/netty-4.1.97.Final...netty-4.1.98.Final)

---
updated-dependencies:
- dependency-name: io.netty:netty-bom
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-09-22 08:18:54 +10:00
26 changed files with 463 additions and 419 deletions

View File

@ -1,12 +1,13 @@
package net.md_5.bungee.api; package net.md_5.bungee.api;
import static org.junit.jupiter.api.Assertions.*;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.SocketAddress; import java.net.SocketAddress;
import java.util.Collection; import java.util.Collection;
import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.ServerConnectEvent; import net.md_5.bungee.api.event.ServerConnectEvent;
import org.junit.Test; import org.junit.jupiter.api.Test;
public class ServerConnectRequestTest public class ServerConnectRequestTest
{ {
@ -78,15 +79,15 @@ public class ServerConnectRequestTest
} }
}; };
@Test(expected = NullPointerException.class) @Test
public void testNullTarget() public void testNullTarget()
{ {
ServerConnectRequest.builder().target( null ).reason( ServerConnectEvent.Reason.JOIN_PROXY ).build(); assertThrows( NullPointerException.class, () -> ServerConnectRequest.builder().target( null ).reason( ServerConnectEvent.Reason.JOIN_PROXY ).build() );
} }
@Test(expected = NullPointerException.class) @Test
public void testNullReason() public void testNullReason()
{ {
ServerConnectRequest.builder().target( DUMMY_INFO ).reason( null ).build(); assertThrows( NullPointerException.class, () -> ServerConnectRequest.builder().target( DUMMY_INFO ).reason( null ).build() );
} }
} }

View File

@ -1,63 +1,38 @@
package net.md_5.bungee.util; package net.md_5.bungee.util;
import static org.junit.jupiter.api.Assertions.*;
import io.netty.channel.unix.DomainSocketAddress; import io.netty.channel.unix.DomainSocketAddress;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.SocketAddress; import java.net.SocketAddress;
import java.util.Arrays; import java.util.stream.Stream;
import java.util.Collection;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import net.md_5.bungee.Util; import net.md_5.bungee.Util;
import org.junit.Assert; import org.junit.jupiter.params.ParameterizedTest;
import org.junit.Test; import org.junit.jupiter.params.provider.Arguments;
import org.junit.runner.RunWith; import org.junit.jupiter.params.provider.MethodSource;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RequiredArgsConstructor @RequiredArgsConstructor
@RunWith(Parameterized.class)
public class AddressParseTest public class AddressParseTest
{ {
@Parameters public static Stream<Arguments> data()
public static Collection<Object[]> data()
{ {
return Arrays.asList( new Object[][] return Stream.of(
{ Arguments.of( "127.0.0.1", "127.0.0.1", Util.DEFAULT_PORT ),
{ Arguments.of( "127.0.0.1:1337", "127.0.0.1", 1337 ),
"127.0.0.1", "127.0.0.1", Util.DEFAULT_PORT Arguments.of( "[::1]", "0:0:0:0:0:0:0:1", Util.DEFAULT_PORT ),
}, Arguments.of( "[0:0:0:0::1]", "0:0:0:0:0:0:0:1", Util.DEFAULT_PORT ),
{ Arguments.of( "[0:0:0:0:0:0:0:1]", "0:0:0:0:0:0:0:1", Util.DEFAULT_PORT ),
"127.0.0.1:1337", "127.0.0.1", 1337 Arguments.of( "[::1]:1337", "0:0:0:0:0:0:0:1", 1337 ),
}, Arguments.of( "[0:0:0:0::1]:1337", "0:0:0:0:0:0:0:1", 1337 ),
{ Arguments.of( "[0:0:0:0:0:0:0:1]:1337", "0:0:0:0:0:0:0:1", 1337 ),
"[::1]", "0:0:0:0:0:0:0:1", Util.DEFAULT_PORT Arguments.of( "unix:///var/run/bungee.sock", "/var/run/bungee.sock", -1 )
}, );
{
"[0:0:0:0::1]", "0:0:0:0:0:0:0:1", Util.DEFAULT_PORT
},
{
"[0:0:0:0:0:0:0:1]", "0:0:0:0:0:0:0:1", Util.DEFAULT_PORT
},
{
"[::1]:1337", "0:0:0:0:0:0:0:1", 1337
},
{
"[0:0:0:0::1]:1337", "0:0:0:0:0:0:0:1", 1337
},
{
"[0:0:0:0:0:0:0:1]:1337", "0:0:0:0:0:0:0:1", 1337
},
{
"unix:///var/run/bungee.sock", "/var/run/bungee.sock", -1
}
} );
} }
private final String line;
private final String host;
private final int port;
@Test @ParameterizedTest
public void test() @MethodSource("data")
public void test(String line, String host, int port)
{ {
SocketAddress parsed = Util.getAddr( line ); SocketAddress parsed = Util.getAddr( line );
@ -65,14 +40,14 @@ public class AddressParseTest
{ {
InetSocketAddress tcp = (InetSocketAddress) parsed; InetSocketAddress tcp = (InetSocketAddress) parsed;
Assert.assertEquals( host, tcp.getHostString() ); assertEquals( host, tcp.getHostString() );
Assert.assertEquals( port, tcp.getPort() ); assertEquals( port, tcp.getPort() );
} else if ( parsed instanceof DomainSocketAddress ) } else if ( parsed instanceof DomainSocketAddress )
{ {
DomainSocketAddress unix = (DomainSocketAddress) parsed; DomainSocketAddress unix = (DomainSocketAddress) parsed;
Assert.assertEquals( host, unix.path() ); assertEquals( host, unix.path() );
Assert.assertEquals( -1, port ); assertEquals( -1, port );
} else } else
{ {
throw new AssertionError( "Unknown socket " + parsed ); throw new AssertionError( "Unknown socket " + parsed );

View File

@ -1,7 +1,7 @@
package net.md_5.bungee.util; package net.md_5.bungee.util;
import org.junit.Assert; import static org.junit.jupiter.api.Assertions.*;
import org.junit.Test; import org.junit.jupiter.api.Test;
public class CaseInsensitiveTest public class CaseInsensitiveTest
{ {
@ -13,12 +13,12 @@ public class CaseInsensitiveTest
CaseInsensitiveMap<Object> map = new CaseInsensitiveMap<>(); CaseInsensitiveMap<Object> map = new CaseInsensitiveMap<>();
map.put( "FOO", obj ); map.put( "FOO", obj );
Assert.assertTrue( map.contains( "foo" ) ); // Assert that contains is case insensitive assertTrue( map.contains( "foo" ) ); // Assert that contains is case insensitive
Assert.assertTrue( map.entrySet().iterator().next().getKey().equals( "FOO" ) ); // Assert that case is preserved assertTrue( map.entrySet().iterator().next().getKey().equals( "FOO" ) ); // Assert that case is preserved
// Assert that remove is case insensitive // Assert that remove is case insensitive
map.remove( "FoO" ); map.remove( "FoO" );
Assert.assertFalse( map.contains( "foo" ) ); assertFalse( map.contains( "foo" ) );
} }
@Test @Test
@ -27,8 +27,8 @@ public class CaseInsensitiveTest
CaseInsensitiveSet set = new CaseInsensitiveSet(); CaseInsensitiveSet set = new CaseInsensitiveSet();
set.add( "FOO" ); set.add( "FOO" );
Assert.assertTrue( set.contains( "foo" ) ); // Assert that contains is case insensitive assertTrue( set.contains( "foo" ) ); // Assert that contains is case insensitive
set.remove( "FoO" ); set.remove( "FoO" );
Assert.assertFalse( set.contains( "foo" ) ); // Assert that remove is case insensitive assertFalse( set.contains( "foo" ) ); // Assert that remove is case insensitive
} }
} }

View File

@ -1,9 +1,9 @@
package net.md_5.bungee.util; package net.md_5.bungee.util;
import static org.junit.jupiter.api.Assertions.*;
import java.util.UUID; import java.util.UUID;
import net.md_5.bungee.Util; import net.md_5.bungee.Util;
import org.junit.Assert; import org.junit.jupiter.api.Test;
import org.junit.Test;
public class UUIDTest public class UUIDTest
{ {
@ -13,7 +13,7 @@ public class UUIDTest
{ {
UUID uuid = UUID.fromString( "af74a02d-19cb-445b-b07f-6866a861f783" ); UUID uuid = UUID.fromString( "af74a02d-19cb-445b-b07f-6866a861f783" );
UUID uuid1 = Util.getUUID( "af74a02d19cb445bb07f6866a861f783" ); UUID uuid1 = Util.getUUID( "af74a02d19cb445bb07f6866a861f783" );
Assert.assertEquals( uuid, uuid1 ); assertEquals( uuid, uuid1 );
} }
@Test @Test
@ -23,7 +23,7 @@ public class UUIDTest
{ {
UUID expected = UUID.randomUUID(); UUID expected = UUID.randomUUID();
UUID actual = Util.getUUID( expected.toString().replace( "-", "" ) ); UUID actual = Util.getUUID( expected.toString().replace( "-", "" ) );
Assert.assertEquals( "Could not parse UUID " + expected, expected, actual ); assertEquals( expected, actual, "Could not parse UUID " + expected );
} }
} }
} }

View File

@ -1,5 +1,6 @@
package net.md_5.bungee.api.chat; package net.md_5.bungee.api.chat;
import static org.junit.jupiter.api.Assertions.*;
import java.awt.Color; import java.awt.Color;
import java.util.function.BiFunction; import java.util.function.BiFunction;
import java.util.function.Consumer; import java.util.function.Consumer;
@ -10,8 +11,7 @@ import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.chat.hover.content.Item; import net.md_5.bungee.api.chat.hover.content.Item;
import net.md_5.bungee.api.chat.hover.content.Text; import net.md_5.bungee.api.chat.hover.content.Text;
import net.md_5.bungee.chat.ComponentSerializer; import net.md_5.bungee.chat.ComponentSerializer;
import org.junit.Assert; import org.junit.jupiter.api.Test;
import org.junit.Test;
public class ComponentsTest public class ComponentsTest
{ {
@ -20,14 +20,14 @@ public class ComponentsTest
{ {
String json = ComponentSerializer.toString( components ); String json = ComponentSerializer.toString( components );
BaseComponent[] parsed = ComponentSerializer.parse( json ); BaseComponent[] parsed = ComponentSerializer.parse( json );
Assert.assertEquals( TextComponent.toLegacyText( parsed ), TextComponent.toLegacyText( components ) ); assertEquals( TextComponent.toLegacyText( parsed ), TextComponent.toLegacyText( components ) );
} }
public static void testDissembleReassemble(BaseComponent component) public static void testDissembleReassemble(BaseComponent component)
{ {
String json = ComponentSerializer.toString( component ); String json = ComponentSerializer.toString( component );
BaseComponent[] parsed = ComponentSerializer.parse( json ); BaseComponent[] parsed = ComponentSerializer.parse( json );
Assert.assertEquals( TextComponent.toLegacyText( parsed ), TextComponent.toLegacyText( component ) ); assertEquals( TextComponent.toLegacyText( parsed ), TextComponent.toLegacyText( component ) );
} }
public static void testAssembleDissemble(String json, boolean modern) public static void testAssembleDissemble(String json, boolean modern)
@ -35,11 +35,11 @@ public class ComponentsTest
if ( modern ) if ( modern )
{ {
BaseComponent deserialized = ComponentSerializer.deserialize( json ); BaseComponent deserialized = ComponentSerializer.deserialize( json );
Assert.assertEquals( json, ComponentSerializer.toString( deserialized ) ); assertEquals( json, ComponentSerializer.toString( deserialized ) );
} else } else
{ {
BaseComponent[] parsed = ComponentSerializer.parse( json ); BaseComponent[] parsed = ComponentSerializer.parse( json );
Assert.assertEquals( json, ComponentSerializer.toString( parsed ) ); assertEquals( json, ComponentSerializer.toString( parsed ) );
} }
} }
@ -69,7 +69,7 @@ public class ComponentsTest
json = "{\"extra\":[{\"text\":\"[\"},{\"extra\":[{\"translate\":\"block.minecraft.dirt\"}],\"text\":\"\"},{\"text\":\"]\"}],\"hoverEvent\":{\"action\":\"show_item\",\"value\":[" + hoverVal + "]},\"text\":\"\"}"; json = "{\"extra\":[{\"text\":\"[\"},{\"extra\":[{\"translate\":\"block.minecraft.dirt\"}],\"text\":\"\"},{\"text\":\"]\"}],\"hoverEvent\":{\"action\":\"show_item\",\"value\":[" + hoverVal + "]},\"text\":\"\"}";
components = ComponentSerializer.parse( json ); components = ComponentSerializer.parse( json );
Text contentText = ( (Text) components[0].getHoverEvent().getContents().get( 0 ) ); Text contentText = ( (Text) components[0].getHoverEvent().getContents().get( 0 ) );
Assert.assertEquals( hoverVal, ComponentSerializer.toString( (BaseComponent[]) contentText.getValue() ) ); assertEquals( hoverVal, ComponentSerializer.toString( (BaseComponent[]) contentText.getValue() ) );
testDissembleReassemble( components ); testDissembleReassemble( components );
////////// //////////
TextComponent component1 = new TextComponent( "HoverableText" ); TextComponent component1 = new TextComponent( "HoverableText" );
@ -80,10 +80,10 @@ public class ComponentsTest
json = ComponentSerializer.toString( component1 ); json = ComponentSerializer.toString( component1 );
components = ComponentSerializer.parse( json ); components = ComponentSerializer.parse( json );
Item parsedContentItem = ( (Item) components[0].getHoverEvent().getContents().get( 0 ) ); Item parsedContentItem = ( (Item) components[0].getHoverEvent().getContents().get( 0 ) );
Assert.assertEquals( contentItem, parsedContentItem ); assertEquals( contentItem, parsedContentItem );
Assert.assertEquals( contentItem.getCount(), parsedContentItem.getCount() ); assertEquals( contentItem.getCount(), parsedContentItem.getCount() );
Assert.assertEquals( contentItem.getId(), parsedContentItem.getId() ); assertEquals( contentItem.getId(), parsedContentItem.getId() );
Assert.assertEquals( nbt, parsedContentItem.getTag().getNbt() ); assertEquals( nbt, parsedContentItem.getTag().getNbt() );
} }
@Test @Test
@ -91,8 +91,8 @@ public class ComponentsTest
{ {
this.testEmptyComponentBuilder( this.testEmptyComponentBuilder(
ComponentBuilder::create, ComponentBuilder::create,
(components) -> Assert.assertEquals( components.length, 0 ), (components) -> assertEquals( components.length, 0 ),
(components, size) -> Assert.assertEquals( size, components.length ) (components, size) -> assertEquals( size, components.length )
); );
} }
@ -101,8 +101,8 @@ public class ComponentsTest
{ {
this.testEmptyComponentBuilder( this.testEmptyComponentBuilder(
ComponentBuilder::build, ComponentBuilder::build,
(component) -> Assert.assertNull( component.getExtra() ), (component) -> assertNull( component.getExtra() ),
(component, size) -> Assert.assertEquals( component.getExtra().size(), size ) (component, size) -> assertEquals( component.getExtra().size(), size )
); );
} }
@ -125,23 +125,23 @@ public class ComponentsTest
public void testDummyRetaining() public void testDummyRetaining()
{ {
ComponentBuilder builder = new ComponentBuilder(); ComponentBuilder builder = new ComponentBuilder();
Assert.assertNotNull( builder.getCurrentComponent() ); assertNotNull( builder.getCurrentComponent() );
builder.color( ChatColor.GREEN ); builder.color( ChatColor.GREEN );
builder.append( "test ", ComponentBuilder.FormatRetention.ALL ); builder.append( "test ", ComponentBuilder.FormatRetention.ALL );
Assert.assertEquals( builder.getCurrentComponent().getColor(), ChatColor.GREEN ); assertEquals( builder.getCurrentComponent().getColor(), ChatColor.GREEN );
} }
@Test(expected = IndexOutOfBoundsException.class) @Test
public void testComponentGettingExceptions() public void testComponentGettingExceptions()
{ {
ComponentBuilder builder = new ComponentBuilder(); ComponentBuilder builder = new ComponentBuilder();
builder.getComponent( -1 ); assertThrows( IndexOutOfBoundsException.class, () -> builder.getComponent( -1 ) );
builder.getComponent( 0 ); assertThrows( IndexOutOfBoundsException.class, () -> builder.getComponent( 0 ) );
builder.getComponent( 1 ); assertThrows( IndexOutOfBoundsException.class, () -> builder.getComponent( 1 ) );
BaseComponent component = new TextComponent( "Hello" ); BaseComponent component = new TextComponent( "Hello" );
builder.append( component ); builder.append( component );
Assert.assertEquals( builder.getComponent( 0 ), component ); assertEquals( builder.getComponent( 0 ), component );
builder.getComponent( 1 ); assertThrows( IndexOutOfBoundsException.class, () -> builder.getComponent( 1 ) );
} }
@Test @Test
@ -150,33 +150,33 @@ public class ComponentsTest
ComponentBuilder builder = new ComponentBuilder(); ComponentBuilder builder = new ComponentBuilder();
TextComponent apple = new TextComponent( "apple" ); TextComponent apple = new TextComponent( "apple" );
builder.append( apple ); builder.append( apple );
Assert.assertEquals( builder.getCurrentComponent(), apple ); assertEquals( builder.getCurrentComponent(), apple );
Assert.assertEquals( builder.getComponent( 0 ), apple ); assertEquals( builder.getComponent( 0 ), apple );
TextComponent mango = new TextComponent( "mango" ); TextComponent mango = new TextComponent( "mango" );
TextComponent orange = new TextComponent( "orange" ); TextComponent orange = new TextComponent( "orange" );
builder.append( mango ); builder.append( mango );
builder.append( orange ); builder.append( orange );
builder.removeComponent( 1 ); // Removing mango builder.removeComponent( 1 ); // Removing mango
Assert.assertEquals( builder.getComponent( 0 ), apple ); assertEquals( builder.getComponent( 0 ), apple );
Assert.assertEquals( builder.getComponent( 1 ), orange ); assertEquals( builder.getComponent( 1 ), orange );
} }
@Test @Test
public void testToLegacyFromLegacy() public void testToLegacyFromLegacy()
{ {
String text = "§a§lHello §f§kworld§7!"; String text = "§a§lHello §f§kworld§7!";
Assert.assertEquals( text, TextComponent.toLegacyText( TextComponent.fromLegacyText( text ) ) ); assertEquals( text, TextComponent.toLegacyText( TextComponent.fromLegacyText( text ) ) );
} }
@Test(expected = IndexOutOfBoundsException.class) @Test
public void testComponentBuilderCursorInvalidPos() public void testComponentBuilderCursorInvalidPos()
{ {
ComponentBuilder builder = new ComponentBuilder(); ComponentBuilder builder = new ComponentBuilder();
builder.append( new TextComponent( "Apple, " ) ); builder.append( new TextComponent( "Apple, " ) );
builder.append( new TextComponent( "Orange, " ) ); builder.append( new TextComponent( "Orange, " ) );
builder.setCursor( -1 ); assertThrows( IndexOutOfBoundsException.class, () -> builder.setCursor( -1 ) );
builder.setCursor( 2 ); assertThrows( IndexOutOfBoundsException.class, () -> builder.setCursor( 2 ) );
} }
@Test @Test
@ -184,24 +184,24 @@ public class ComponentsTest
{ {
TextComponent t1, t2, t3; TextComponent t1, t2, t3;
ComponentBuilder builder = new ComponentBuilder(); ComponentBuilder builder = new ComponentBuilder();
Assert.assertEquals( builder.getCursor(), -1 ); assertEquals( builder.getCursor(), -1 );
builder.append( t1 = new TextComponent( "Apple, " ) ); builder.append( t1 = new TextComponent( "Apple, " ) );
Assert.assertEquals( builder.getCursor(), 0 ); assertEquals( builder.getCursor(), 0 );
builder.append( t2 = new TextComponent( "Orange, " ) ); builder.append( t2 = new TextComponent( "Orange, " ) );
builder.append( t3 = new TextComponent( "Mango, " ) ); builder.append( t3 = new TextComponent( "Mango, " ) );
Assert.assertEquals( builder.getCursor(), 2 ); assertEquals( builder.getCursor(), 2 );
builder.setCursor( 0 ); builder.setCursor( 0 );
Assert.assertEquals( builder.getCurrentComponent(), t1 ); assertEquals( builder.getCurrentComponent(), t1 );
// Test that appending new components updates the position to the new list size // Test that appending new components updates the position to the new list size
// after having previously set it to 0 (first component) // after having previously set it to 0 (first component)
builder.append( new TextComponent( "and Grapefruit" ) ); builder.append( new TextComponent( "and Grapefruit" ) );
Assert.assertEquals( builder.getCursor(), 3 ); assertEquals( builder.getCursor(), 3 );
builder.setCursor( 0 ); builder.setCursor( 0 );
builder.resetCursor(); builder.resetCursor();
Assert.assertEquals( builder.getCursor(), 3 ); assertEquals( builder.getCursor(), 3 );
} }
@Test @Test
@ -210,7 +210,7 @@ public class ComponentsTest
String text = "§a§lHello §r§kworld§7!"; String text = "§a§lHello §r§kworld§7!";
BaseComponent[] components = TextComponent.fromLegacyText( text ); BaseComponent[] components = TextComponent.fromLegacyText( text );
BaseComponent[] builderComponents = new ComponentBuilder().append( components ).create(); BaseComponent[] builderComponents = new ComponentBuilder().append( components ).create();
Assert.assertArrayEquals( components, builderComponents ); assertArrayEquals( components, builderComponents );
} }
/* /*
@ -232,7 +232,7 @@ public class ComponentsTest
component.setHoverEvent( event ); component.setHoverEvent( event );
String serialised = ComponentSerializer.toString( component ); String serialised = ComponentSerializer.toString( component );
BaseComponent[] deserialised = ComponentSerializer.parse( serialised ); BaseComponent[] deserialised = ComponentSerializer.parse( serialised );
Assert.assertEquals( TextComponent.toLegacyText( deserialised ), TextComponent.toLegacyText( component ) ); assertEquals( TextComponent.toLegacyText( deserialised ), TextComponent.toLegacyText( component ) );
} }
*/ */
@ -247,9 +247,9 @@ public class ComponentsTest
); );
TextComponent component = new TextComponent( "test" ); TextComponent component = new TextComponent( "test" );
component.setHoverEvent( hoverEvent ); component.setHoverEvent( hoverEvent );
Assert.assertEquals( component.getHoverEvent().getContents().size(), 1 ); assertEquals( component.getHoverEvent().getContents().size(), 1 );
Assert.assertTrue( component.getHoverEvent().getContents().get( 0 ) instanceof Text ); assertTrue( component.getHoverEvent().getContents().get( 0 ) instanceof Text );
Assert.assertEquals( ( (Text) component.getHoverEvent().getContents().get( 0 ) ).getValue(), advancement ); assertEquals( ( (Text) component.getHoverEvent().getContents().get( 0 ) ).getValue(), advancement );
} }
@Test @Test
@ -274,11 +274,11 @@ public class ComponentsTest
TextComponent component = new TextComponent( "Sample text" ); TextComponent component = new TextComponent( "Sample text" );
component.setHoverEvent( hoverEvent ); component.setHoverEvent( hoverEvent );
Assert.assertEquals( hoverEvent.getContents().size(), 1 ); assertEquals( hoverEvent.getContents().size(), 1 );
Assert.assertTrue( hoverEvent.isLegacy() ); assertTrue( hoverEvent.isLegacy() );
String serialized = ComponentSerializer.toString( component ); String serialized = ComponentSerializer.toString( component );
BaseComponent[] deserialized = ComponentSerializer.parse( serialized ); BaseComponent[] deserialized = ComponentSerializer.parse( serialized );
Assert.assertEquals( component.getHoverEvent(), deserialized[0].getHoverEvent() ); assertEquals( component.getHoverEvent(), deserialized[0].getHoverEvent() );
} }
@Test @Test
@ -303,12 +303,12 @@ public class ComponentsTest
{ {
TextComponent component = new TextComponent( "Sample text" ); TextComponent component = new TextComponent( "Sample text" );
component.setHoverEvent( hoverEvent ); component.setHoverEvent( hoverEvent );
Assert.assertEquals( hoverEvent.getContents().size(), 2 ); assertEquals( hoverEvent.getContents().size(), 2 );
Assert.assertFalse( hoverEvent.isLegacy() ); assertFalse( hoverEvent.isLegacy() );
String serialized = ComponentSerializer.toString( component ); String serialized = ComponentSerializer.toString( component );
T deserialized = deserializer.apply( serialized ); T deserialized = deserializer.apply( serialized );
Assert.assertEquals( component.getHoverEvent(), hoverEventGetter.apply( deserialized ) ); assertEquals( component.getHoverEvent(), hoverEventGetter.apply( deserialized ) );
// Test single content: // Test single content:
String json = "{\"italic\":true,\"color\":\"gray\",\"translate\":\"chat.type.admin\",\"with\":[{\"text\":\"@\"}" String json = "{\"italic\":true,\"color\":\"gray\",\"translate\":\"chat.type.admin\",\"with\":[{\"text\":\"@\"}"
@ -345,10 +345,10 @@ public class ComponentsTest
TextComponent second = new TextComponent( " world" ); TextComponent second = new TextComponent( " world" );
second.copyFormatting( first, ComponentBuilder.FormatRetention.ALL, true ); second.copyFormatting( first, ComponentBuilder.FormatRetention.ALL, true );
Assert.assertEquals( first.isBold(), second.isBold() ); assertEquals( first.isBold(), second.isBold() );
Assert.assertEquals( first.getColor(), second.getColor() ); assertEquals( first.getColor(), second.getColor() );
Assert.assertEquals( first.getClickEvent(), second.getClickEvent() ); assertEquals( first.getClickEvent(), second.getClickEvent() );
Assert.assertEquals( first.getHoverEvent(), second.getHoverEvent() ); assertEquals( first.getHoverEvent(), second.getHoverEvent() );
} }
@Test @Test
@ -368,7 +368,7 @@ public class ComponentsTest
ComponentBuilder builder = new ComponentBuilder( "Hello " ).color( ChatColor.RED ).append( "world" ).color( ChatColor.DARK_RED ); ComponentBuilder builder = new ComponentBuilder( "Hello " ).color( ChatColor.RED ).append( "world" ).color( ChatColor.DARK_RED );
ComponentBuilder cloned = new ComponentBuilder( builder ); ComponentBuilder cloned = new ComponentBuilder( builder );
Assert.assertEquals( legacyTextFunction.apply( builder ), legacyTextFunction.apply( cloned ) ); assertEquals( legacyTextFunction.apply( builder ), legacyTextFunction.apply( cloned ) );
} }
@Test @Test
@ -403,10 +403,10 @@ public class ComponentsTest
ScoreComponent scoreComponent = new ScoreComponent( "myscore", "myobjective" ); ScoreComponent scoreComponent = new ScoreComponent( "myscore", "myobjective" );
builder.append( scoreComponent ); // non array based BaseComponent append builder.append( scoreComponent ); // non array based BaseComponent append
T component = componentBuilder.apply( builder ); T component = componentBuilder.apply( builder );
Assert.assertEquals( "Hello ", extraGetter.apply( component, 0 ).toPlainText() ); assertEquals( "Hello ", extraGetter.apply( component, 0 ).toPlainText() );
Assert.assertEquals( textComponent.toPlainText(), extraGetter.apply( component, 1 ).toPlainText() ); assertEquals( textComponent.toPlainText(), extraGetter.apply( component, 1 ).toPlainText() );
Assert.assertEquals( translatableComponent.toPlainText(), extraGetter.apply( component, 2 ).toPlainText() ); assertEquals( translatableComponent.toPlainText(), extraGetter.apply( component, 2 ).toPlainText() );
Assert.assertEquals( scoreComponent.toPlainText(), extraGetter.apply( component, 3 ).toPlainText() ); assertEquals( scoreComponent.toPlainText(), extraGetter.apply( component, 3 ).toPlainText() );
} }
@Test @Test
@ -416,7 +416,7 @@ public class ComponentsTest
String text = ComponentSerializer.toString( component ); String text = ComponentSerializer.toString( component );
BaseComponent[] reparsed = ComponentSerializer.parse( text ); BaseComponent[] reparsed = ComponentSerializer.parse( text );
Assert.assertArrayEquals( component, reparsed ); assertArrayEquals( component, reparsed );
} }
@Test @Test
@ -456,10 +456,10 @@ public class ComponentsTest
T component = componentBuilder.apply( builder ); T component = componentBuilder.apply( builder );
Assert.assertEquals( extraGetter.apply( component, 1 ).getHoverEvent(), hoverEvent ); assertEquals( extraGetter.apply( component, 1 ).getHoverEvent(), hoverEvent );
Assert.assertEquals( extraGetter.apply( component, 1 ).getClickEvent(), clickEvent ); assertEquals( extraGetter.apply( component, 1 ).getClickEvent(), clickEvent );
Assert.assertEquals( "Hello world!", toPlainTextFunction.apply( component ) ); assertEquals( "Hello world!", toPlainTextFunction.apply( component ) );
Assert.assertEquals( expectedLegacyText, toLegacyTextFunction.apply( component ) ); assertEquals( expectedLegacyText, toLegacyTextFunction.apply( component ) );
} }
@Test @Test
@ -492,8 +492,8 @@ public class ComponentsTest
T component = componentBuilder.apply( builder ); T component = componentBuilder.apply( builder );
Assert.assertEquals( "Hello world!", toPlainTextFunction.apply( component ) ); assertEquals( "Hello world!", toPlainTextFunction.apply( component ) );
Assert.assertEquals( expectedLegacyString, toLegacyTextFunction.apply( component ) ); assertEquals( expectedLegacyString, toLegacyTextFunction.apply( component ) );
} }
@Test @Test
@ -502,8 +502,8 @@ public class ComponentsTest
TextComponent textComponent = new TextComponent( "Hello world" ); TextComponent textComponent = new TextComponent( "Hello world" );
textComponent.setColor( ChatColor.RED ); textComponent.setColor( ChatColor.RED );
Assert.assertEquals( "Hello world", textComponent.toPlainText() ); assertEquals( "Hello world", textComponent.toPlainText() );
Assert.assertEquals( ChatColor.RED + "Hello world", textComponent.toLegacyText() ); assertEquals( ChatColor.RED + "Hello world", textComponent.toLegacyText() );
} }
@Test @Test
@ -511,25 +511,25 @@ public class ComponentsTest
{ {
BaseComponent[] test1 = TextComponent.fromLegacyText( ChatColor.AQUA + "Aqua " + ChatColor.RED + ChatColor.BOLD + "RedBold" ); BaseComponent[] test1 = TextComponent.fromLegacyText( ChatColor.AQUA + "Aqua " + ChatColor.RED + ChatColor.BOLD + "RedBold" );
Assert.assertEquals( "Aqua RedBold", BaseComponent.toPlainText( test1 ) ); assertEquals( "Aqua RedBold", BaseComponent.toPlainText( test1 ) );
Assert.assertEquals( ChatColor.AQUA + "Aqua " + ChatColor.RED + ChatColor.BOLD + "RedBold", BaseComponent.toLegacyText( test1 ) ); assertEquals( ChatColor.AQUA + "Aqua " + ChatColor.RED + ChatColor.BOLD + "RedBold", BaseComponent.toLegacyText( test1 ) );
BaseComponent[] test2 = TextComponent.fromLegacyText( "Text http://spigotmc.org " + ChatColor.GREEN + "google.com/test" ); BaseComponent[] test2 = TextComponent.fromLegacyText( "Text http://spigotmc.org " + ChatColor.GREEN + "google.com/test" );
Assert.assertEquals( "Text http://spigotmc.org google.com/test", BaseComponent.toPlainText( test2 ) ); assertEquals( "Text http://spigotmc.org google.com/test", BaseComponent.toPlainText( test2 ) );
//The extra ChatColor instances are sometimes inserted when not needed but it doesn't change the result //The extra ChatColor instances are sometimes inserted when not needed but it doesn't change the result
Assert.assertEquals( ChatColor.WHITE + "Text " + ChatColor.WHITE + "http://spigotmc.org" + ChatColor.WHITE assertEquals( ChatColor.WHITE + "Text " + ChatColor.WHITE + "http://spigotmc.org" + ChatColor.WHITE
+ " " + ChatColor.GREEN + "google.com/test" + ChatColor.GREEN, BaseComponent.toLegacyText( test2 ) ); + " " + ChatColor.GREEN + "google.com/test" + ChatColor.GREEN, BaseComponent.toLegacyText( test2 ) );
ClickEvent url1 = test2[1].getClickEvent(); ClickEvent url1 = test2[1].getClickEvent();
Assert.assertNotNull( url1 ); assertNotNull( url1 );
Assert.assertTrue( url1.getAction() == ClickEvent.Action.OPEN_URL ); assertTrue( url1.getAction() == ClickEvent.Action.OPEN_URL );
Assert.assertEquals( "http://spigotmc.org", url1.getValue() ); assertEquals( "http://spigotmc.org", url1.getValue() );
ClickEvent url2 = test2[3].getClickEvent(); ClickEvent url2 = test2[3].getClickEvent();
Assert.assertNotNull( url2 ); assertNotNull( url2 );
Assert.assertTrue( url2.getAction() == ClickEvent.Action.OPEN_URL ); assertTrue( url2.getAction() == ClickEvent.Action.OPEN_URL );
Assert.assertEquals( "http://google.com/test", url2.getValue() ); assertEquals( "http://google.com/test", url2.getValue() );
} }
@Test @Test
@ -541,18 +541,18 @@ public class ComponentsTest
item, "5", item, "5",
"thinkofdeath" ); "thinkofdeath" );
Assert.assertEquals( "Given Golden Sword * 5 to thinkofdeath", translatableComponent.toPlainText() ); assertEquals( "Given Golden Sword * 5 to thinkofdeath", translatableComponent.toPlainText() );
Assert.assertEquals( ChatColor.WHITE + "Given " + ChatColor.AQUA + "Golden Sword" + ChatColor.WHITE assertEquals( ChatColor.WHITE + "Given " + ChatColor.AQUA + "Golden Sword" + ChatColor.WHITE
+ " * " + ChatColor.WHITE + "5" + ChatColor.WHITE + " to " + ChatColor.WHITE + "thinkofdeath", + " * " + ChatColor.WHITE + "5" + ChatColor.WHITE + " to " + ChatColor.WHITE + "thinkofdeath",
translatableComponent.toLegacyText() ); translatableComponent.toLegacyText() );
TranslatableComponent positional = new TranslatableComponent( "book.pageIndicator", "5", "50" ); TranslatableComponent positional = new TranslatableComponent( "book.pageIndicator", "5", "50" );
Assert.assertEquals( "Page 5 of 50", positional.toPlainText() ); assertEquals( "Page 5 of 50", positional.toPlainText() );
Assert.assertEquals( ChatColor.WHITE + "Page " + ChatColor.WHITE + "5" + ChatColor.WHITE + " of " + ChatColor.WHITE + "50", positional.toLegacyText() ); assertEquals( ChatColor.WHITE + "Page " + ChatColor.WHITE + "5" + ChatColor.WHITE + " of " + ChatColor.WHITE + "50", positional.toLegacyText() );
TranslatableComponent one_four_two = new TranslatableComponent( "filled_map.buried_treasure" ); TranslatableComponent one_four_two = new TranslatableComponent( "filled_map.buried_treasure" );
Assert.assertEquals( "Buried Treasure Map", one_four_two.toPlainText() ); assertEquals( "Buried Treasure Map", one_four_two.toPlainText() );
} }
@Test @Test
@ -586,8 +586,8 @@ public class ComponentsTest
append( "World" ).bold( true ).color( ChatColor.BLUE ). append( "World" ).bold( true ).color( ChatColor.BLUE ).
append( "!" ).color( ChatColor.YELLOW ) ); append( "!" ).color( ChatColor.YELLOW ) );
Assert.assertEquals( "Hello World!", toPlainTextFunction.apply( component ) ); assertEquals( "Hello World!", toPlainTextFunction.apply( component ) );
Assert.assertEquals( expectedLegacyString, toLegacyTextFunction.apply( component ) ); assertEquals( expectedLegacyString, toLegacyTextFunction.apply( component ) );
} }
@Test @Test
@ -613,8 +613,8 @@ public class ComponentsTest
T component = componentBuilder.apply( new ComponentBuilder( "Hello " ).color( ChatColor.RED ) T component = componentBuilder.apply( new ComponentBuilder( "Hello " ).color( ChatColor.RED )
.append( "World" ).reset() ); .append( "World" ).reset() );
Assert.assertEquals( ChatColor.RED, extraGetter.apply( component, 0 ).getColor() ); assertEquals( ChatColor.RED, extraGetter.apply( component, 0 ).getColor() );
Assert.assertEquals( ChatColor.WHITE, extraGetter.apply( component, 1 ).getColor() ); assertEquals( ChatColor.WHITE, extraGetter.apply( component, 1 ).getColor() );
} }
@Test @Test
@ -640,41 +640,41 @@ public class ComponentsTest
T noneRetention = componentBuilder.apply( new ComponentBuilder( "Hello " ).color( ChatColor.RED ) T noneRetention = componentBuilder.apply( new ComponentBuilder( "Hello " ).color( ChatColor.RED )
.append( "World", ComponentBuilder.FormatRetention.NONE ) ); .append( "World", ComponentBuilder.FormatRetention.NONE ) );
Assert.assertEquals( ChatColor.RED, extraGetter.apply( noneRetention, 0 ).getColor() ); assertEquals( ChatColor.RED, extraGetter.apply( noneRetention, 0 ).getColor() );
Assert.assertEquals( ChatColor.WHITE, extraGetter.apply( noneRetention, 1 ).getColor() ); assertEquals( ChatColor.WHITE, extraGetter.apply( noneRetention, 1 ).getColor() );
HoverEvent testEvent = new HoverEvent( HoverEvent.Action.SHOW_TEXT, new Text( new ComponentBuilder( "test" ).build() ) ); HoverEvent testEvent = new HoverEvent( HoverEvent.Action.SHOW_TEXT, new Text( new ComponentBuilder( "test" ).build() ) );
T formattingRetention = componentBuilder.apply( new ComponentBuilder( "Hello " ).color( ChatColor.RED ) T formattingRetention = componentBuilder.apply( new ComponentBuilder( "Hello " ).color( ChatColor.RED )
.event( testEvent ).append( "World", ComponentBuilder.FormatRetention.FORMATTING ) ); .event( testEvent ).append( "World", ComponentBuilder.FormatRetention.FORMATTING ) );
Assert.assertEquals( ChatColor.RED, extraGetter.apply( formattingRetention, 0 ).getColor() ); assertEquals( ChatColor.RED, extraGetter.apply( formattingRetention, 0 ).getColor() );
Assert.assertEquals( testEvent, extraGetter.apply( formattingRetention, 0 ).getHoverEvent() ); assertEquals( testEvent, extraGetter.apply( formattingRetention, 0 ).getHoverEvent() );
Assert.assertEquals( ChatColor.RED, extraGetter.apply( formattingRetention, 1 ).getColor() ); assertEquals( ChatColor.RED, extraGetter.apply( formattingRetention, 1 ).getColor() );
Assert.assertNull( extraGetter.apply( formattingRetention, 1 ).getHoverEvent() ); assertNull( extraGetter.apply( formattingRetention, 1 ).getHoverEvent() );
ClickEvent testClickEvent = new ClickEvent( ClickEvent.Action.OPEN_URL, "http://www.example.com" ); ClickEvent testClickEvent = new ClickEvent( ClickEvent.Action.OPEN_URL, "http://www.example.com" );
T eventRetention = componentBuilder.apply( new ComponentBuilder( "Hello " ).color( ChatColor.RED ) T eventRetention = componentBuilder.apply( new ComponentBuilder( "Hello " ).color( ChatColor.RED )
.event( testEvent ).event( testClickEvent ).append( "World", ComponentBuilder.FormatRetention.EVENTS ) ); .event( testEvent ).event( testClickEvent ).append( "World", ComponentBuilder.FormatRetention.EVENTS ) );
Assert.assertEquals( ChatColor.RED, extraGetter.apply( eventRetention, 0 ).getColor() ); assertEquals( ChatColor.RED, extraGetter.apply( eventRetention, 0 ).getColor() );
Assert.assertEquals( testEvent, extraGetter.apply( eventRetention, 0 ).getHoverEvent() ); assertEquals( testEvent, extraGetter.apply( eventRetention, 0 ).getHoverEvent() );
Assert.assertEquals( testClickEvent, extraGetter.apply( eventRetention, 0 ).getClickEvent() ); assertEquals( testClickEvent, extraGetter.apply( eventRetention, 0 ).getClickEvent() );
Assert.assertEquals( ChatColor.WHITE, extraGetter.apply( eventRetention, 1 ).getColor() ); assertEquals( ChatColor.WHITE, extraGetter.apply( eventRetention, 1 ).getColor() );
Assert.assertEquals( testEvent, extraGetter.apply( eventRetention, 1 ).getHoverEvent() ); assertEquals( testEvent, extraGetter.apply( eventRetention, 1 ).getHoverEvent() );
Assert.assertEquals( testClickEvent, extraGetter.apply( eventRetention, 1 ).getClickEvent() ); assertEquals( testClickEvent, extraGetter.apply( eventRetention, 1 ).getClickEvent() );
} }
@Test(expected = IllegalArgumentException.class) @Test
public void testLoopSimple() public void testLoopSimple()
{ {
TextComponent component = new TextComponent( "Testing" ); TextComponent component = new TextComponent( "Testing" );
component.addExtra( component ); component.addExtra( component );
ComponentSerializer.toString( component ); assertThrows( IllegalArgumentException.class, () -> ComponentSerializer.toString( component ) );
} }
@Test(expected = IllegalArgumentException.class) @Test
public void testLoopComplex() public void testLoopComplex()
{ {
TextComponent a = new TextComponent( "A" ); TextComponent a = new TextComponent( "A" );
@ -685,7 +685,7 @@ public class ComponentsTest
a.addExtra( b ); a.addExtra( b );
b.addExtra( c ); b.addExtra( c );
c.addExtra( a ); c.addExtra( a );
ComponentSerializer.toString( a ); assertThrows( IllegalArgumentException.class, () -> ComponentSerializer.toString( a ) );
} }
@Test @Test
@ -699,7 +699,7 @@ public class ComponentsTest
ComponentSerializer.toString( a ); ComponentSerializer.toString( a );
} }
@Test(expected = IllegalArgumentException.class) @Test
public void testRepeatedError() public void testRepeatedError()
{ {
TextComponent a = new TextComponent( "A" ); TextComponent a = new TextComponent( "A" );
@ -711,7 +711,7 @@ public class ComponentsTest
a.addExtra( c ); a.addExtra( c );
c.addExtra( a ); c.addExtra( a );
a.addExtra( b ); a.addExtra( b );
ComponentSerializer.toString( a ); assertThrows( IllegalArgumentException.class, () -> ComponentSerializer.toString( a ) );
} }
@Test @Test
@ -736,7 +736,7 @@ public class ComponentsTest
String emptyLegacyText = fromAndToLegacyText( "" ); String emptyLegacyText = fromAndToLegacyText( "" );
// all invalid color codes and the trailing '§' should be ignored // all invalid color codes and the trailing '§' should be ignored
Assert.assertEquals( emptyLegacyText, invalidColorCodesLegacyText ); assertEquals( emptyLegacyText, invalidColorCodesLegacyText );
} }
@Test @Test
@ -745,12 +745,12 @@ public class ComponentsTest
String text = "§a"; String text = "§a";
BaseComponent[] converted = TextComponent.fromLegacyText( text ); BaseComponent[] converted = TextComponent.fromLegacyText( text );
Assert.assertEquals( ChatColor.GREEN, converted[0].getColor() ); assertEquals( ChatColor.GREEN, converted[0].getColor() );
String roundtripLegacyText = BaseComponent.toLegacyText( converted ); String roundtripLegacyText = BaseComponent.toLegacyText( converted );
// color code should not be lost during conversion // color code should not be lost during conversion
Assert.assertEquals( text, roundtripLegacyText ); assertEquals( text, roundtripLegacyText );
} }
@Test @Test
@ -762,7 +762,7 @@ public class ComponentsTest
TextComponent second = new TextComponent( "Hello, " ); TextComponent second = new TextComponent( "Hello, " );
second.addExtra( new TextComponent( "World!" ) ); second.addExtra( new TextComponent( "World!" ) );
Assert.assertEquals( first, second ); assertEquals( first, second );
} }
@Test @Test
@ -774,7 +774,7 @@ public class ComponentsTest
TextComponent second = new TextComponent( "Hello, " ); TextComponent second = new TextComponent( "Hello, " );
second.addExtra( new TextComponent( "World!" ) ); second.addExtra( new TextComponent( "World!" ) );
Assert.assertNotEquals( first, second ); assertNotEquals( first, second );
} }
@Test @Test
@ -785,7 +785,7 @@ public class ComponentsTest
BaseComponent[] reColored = TextComponent.fromLegacyText( legacy ); BaseComponent[] reColored = TextComponent.fromLegacyText( legacy );
Assert.assertArrayEquals( hexColored, reColored ); assertArrayEquals( hexColored, reColored );
} }
@Test @Test
@ -817,18 +817,18 @@ public class ComponentsTest
String expected = "{\"extra\":[{\"underlined\":true,\"color\":\"dark_red\",\"text\":\"44444\"},{\"color\":" String expected = "{\"extra\":[{\"underlined\":true,\"color\":\"dark_red\",\"text\":\"44444\"},{\"color\":"
+ "\"white\",\"text\":\"dd\"},{\"bold\":true,\"color\":\"gold\",\"text\":\"6666\"}],\"text\":\"\"}"; + "\"white\",\"text\":\"dd\"},{\"bold\":true,\"color\":\"gold\",\"text\":\"6666\"}],\"text\":\"\"}";
Assert.assertEquals( expected, ComponentSerializer.toString( a ) ); assertEquals( expected, ComponentSerializer.toString( a ) );
builder.append( a ); builder.append( a );
String test1 = componentSerializer.apply( componentBuilder.apply( builder ) ); String test1 = componentSerializer.apply( componentBuilder.apply( builder ) );
Assert.assertEquals( expected, test1 ); assertEquals( expected, test1 );
BaseComponent[] b = TextComponent.fromLegacyText( "§rrrrr" ); BaseComponent[] b = TextComponent.fromLegacyText( "§rrrrr" );
builder.append( b ); builder.append( b );
String test2 = componentSerializer.apply( componentBuilder.apply( builder ) ); String test2 = componentSerializer.apply( componentBuilder.apply( builder ) );
Assert.assertEquals( assertEquals(
"{\"extra\":[{\"underlined\":true,\"color\":\"dark_red\",\"text\":\"44444\"}," "{\"extra\":[{\"underlined\":true,\"color\":\"dark_red\",\"text\":\"44444\"},"
+ "{\"color\":\"white\",\"text\":\"dd\"},{\"bold\":true,\"color\":\"gold\",\"text\":\"6666\"}," + "{\"color\":\"white\",\"text\":\"dd\"},{\"bold\":true,\"color\":\"gold\",\"text\":\"6666\"},"
+ "{\"color\":\"white\",\"text\":\"rrrr\"}],\"text\":\"\"}", + "{\"color\":\"white\",\"text\":\"rrrr\"}],\"text\":\"\"}",

View File

@ -1,8 +1,8 @@
package net.md_5.bungee.api.chat; package net.md_5.bungee.api.chat;
import static org.junit.jupiter.api.Assertions.*;
import net.md_5.bungee.chat.ComponentSerializer; import net.md_5.bungee.chat.ComponentSerializer;
import org.junit.Assert; import org.junit.jupiter.api.Test;
import org.junit.Test;
public class TranslatableComponentTest public class TranslatableComponentTest
{ {
@ -11,8 +11,8 @@ public class TranslatableComponentTest
public void testMissingPlaceholdersAdded() public void testMissingPlaceholdersAdded()
{ {
TranslatableComponent testComponent = new TranslatableComponent( "Test string with %s placeholders: %s", 2, "aoeu" ); TranslatableComponent testComponent = new TranslatableComponent( "Test string with %s placeholders: %s", 2, "aoeu" );
Assert.assertEquals( "Test string with 2 placeholders: aoeu", testComponent.toPlainText() ); assertEquals( "Test string with 2 placeholders: aoeu", testComponent.toPlainText() );
Assert.assertEquals( "§fTest string with §f2§f placeholders: §faoeu", testComponent.toLegacyText() ); assertEquals( "§fTest string with §f2§f placeholders: §faoeu", testComponent.toLegacyText() );
} }
@Test @Test
@ -22,7 +22,7 @@ public class TranslatableComponentTest
String jsonString = ComponentSerializer.toString( testComponent ); String jsonString = ComponentSerializer.toString( testComponent );
BaseComponent[] baseComponents = ComponentSerializer.parse( jsonString ); BaseComponent[] baseComponents = ComponentSerializer.parse( jsonString );
Assert.assertEquals( "Test string with a placeholder", TextComponent.toPlainText( baseComponents ) ); assertEquals( "Test string with a placeholder", TextComponent.toPlainText( baseComponents ) );
Assert.assertEquals( "§fTest string with §fa§f placeholder", TextComponent.toLegacyText( baseComponents ) ); assertEquals( "§fTest string with §fa§f placeholder", TextComponent.toLegacyText( baseComponents ) );
} }
} }

View File

@ -36,7 +36,6 @@
<module name="SuppressWarningsHolder"/> <module name="SuppressWarningsHolder"/>
<!-- See http://checkstyle.sourceforge.net/config_imports.html --> <!-- See http://checkstyle.sourceforge.net/config_imports.html -->
<module name="AvoidStarImport"/>
<module name="ImportOrder"> <module name="ImportOrder">
<property name="option" value="above"/> <property name="option" value="above"/>
<property name="ordered" value="true"/> <property name="ordered" value="true"/>

View File

@ -1,148 +1,138 @@
package net.md_5.bungee.config; package net.md_5.bungee.config;
import static org.junit.jupiter.api.Assertions.*;
import java.io.StringReader; import java.io.StringReader;
import java.io.StringWriter; import java.io.StringWriter;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Stream;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.junit.Assert; import org.junit.jupiter.params.ParameterizedTest;
import org.junit.Test; import org.junit.jupiter.params.provider.Arguments;
import org.junit.runner.RunWith; import org.junit.jupiter.params.provider.MethodSource;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RequiredArgsConstructor @RequiredArgsConstructor
@RunWith(Parameterized.class)
public class CompoundConfigurationTest public class CompoundConfigurationTest
{ {
@Parameters(name = "{0}") public static Stream<Arguments> data()
public static Iterable<Object[]> data()
{ {
// CHECKSTYLE:OFF return Stream.of(
return Arrays.asList( new Object[][] Arguments.of(
{ // provider
{ YamlConfiguration.class,
// provider // testDocument
YamlConfiguration.class, ""
// testDocument + "receipt: Oz-Ware Purchase Invoice\n"
"" + "date: 2012-08-06\n"
+ "receipt: Oz-Ware Purchase Invoice\n" + "customer:\n"
+ "date: 2012-08-06\n" + " given: Dorothy\n"
+ "customer:\n" + " family: Gale\n"
+ " given: Dorothy\n" + "\n"
+ " family: Gale\n" + "items:\n"
+ "\n" + " - part_no: A4786\n"
+ "items:\n" + " descrip: Water Bucket (Filled)\n"
+ " - part_no: A4786\n" + " price: 1.47\n"
+ " descrip: Water Bucket (Filled)\n" + " quantity: 4\n"
+ " price: 1.47\n" + "\n"
+ " quantity: 4\n" + " - part_no: E1628\n"
+ "\n" + " descrip: High Heeled \"Ruby\" Slippers\n"
+ " - part_no: E1628\n" + " size: 8\n"
+ " descrip: High Heeled \"Ruby\" Slippers\n" + " price: 100.27\n"
+ " size: 8\n" + " quantity: 1\n"
+ " price: 100.27\n" + "\n"
+ " quantity: 1\n" + "bill-to: &id001\n"
+ "\n" + " street: |\n"
+ "bill-to: &id001\n" + " 123 Tornado Alley\n"
+ " street: |\n" + " Suite 16\n"
+ " 123 Tornado Alley\n" + " city: East Centerville\n"
+ " Suite 16\n" + " state: KS\n"
+ " city: East Centerville\n" + "\n"
+ " state: KS\n" + "ship-to: *id001\n"
+ "\n" + "\n"
+ "ship-to: *id001\n" + "specialDelivery: >\n"
+ "\n" + " Follow the Yellow Brick\n"
+ "specialDelivery: >\n" + " Road to the Emerald City.\n"
+ " Follow the Yellow Brick\n" + " Pay no attention to the\n"
+ " Road to the Emerald City.\n" + " man behind the curtain.",
+ " Pay no attention to the\n" // numberTest
+ " man behind the curtain.", ""
// numberTest + "someKey:\n"
"" + " 1: 1\n"
+ "someKey:\n" + " 2: 2\n"
+ " 1: 1\n" + " 3: 3\n"
+ " 2: 2\n" + " 4: 4",
+ " 3: 3\n" // nullTest
+ " 4: 4", ""
// nullTest + "null:\n"
"" + " null: object\n"
+ "null:\n" + " object: null\n"
+ " null: object\n" ),
+ " object: null\n" Arguments.of(
}, // provider
{ JsonConfiguration.class,
// provider // testDocument
JsonConfiguration.class, ""
// testDocument + "{\n"
"" + " \"customer\": {\n"
+ "{\n" + " \"given\": \"Dorothy\", \n"
+ " \"customer\": {\n" + " \"family\": \"Gale\"\n"
+ " \"given\": \"Dorothy\", \n" + " }, \n"
+ " \"family\": \"Gale\"\n" + " \"ship-to\": {\n"
+ " }, \n" + " \"city\": \"East Centerville\", \n"
+ " \"ship-to\": {\n" + " \"state\": \"KS\", \n"
+ " \"city\": \"East Centerville\", \n" + " \"street\": \"123 Tornado Alley\\nSuite 16\\n\"\n"
+ " \"state\": \"KS\", \n" + " }, \n"
+ " \"street\": \"123 Tornado Alley\\nSuite 16\\n\"\n" + " \"bill-to\": {\n"
+ " }, \n" + " \"city\": \"East Centerville\", \n"
+ " \"bill-to\": {\n" + " \"state\": \"KS\", \n"
+ " \"city\": \"East Centerville\", \n" + " \"street\": \"123 Tornado Alley\\nSuite 16\\n\"\n"
+ " \"state\": \"KS\", \n" + " }, \n"
+ " \"street\": \"123 Tornado Alley\\nSuite 16\\n\"\n" + " \"date\": \"2012-08-06\", \n"
+ " }, \n" + " \"items\": [\n"
+ " \"date\": \"2012-08-06\", \n" + " {\n"
+ " \"items\": [\n" + " \"part_no\": \"A4786\", \n"
+ " {\n" + " \"price\": 1.47, \n"
+ " \"part_no\": \"A4786\", \n" + " \"descrip\": \"Water Bucket (Filled)\", \n"
+ " \"price\": 1.47, \n" + " \"quantity\": 4\n"
+ " \"descrip\": \"Water Bucket (Filled)\", \n" + " }, \n"
+ " \"quantity\": 4\n" + " {\n"
+ " }, \n" + " \"part_no\": \"E1628\", \n"
+ " {\n" + " \"descrip\": \"High Heeled \\\"Ruby\\\" Slippers\", \n"
+ " \"part_no\": \"E1628\", \n" + " \"price\": 100.27, \n"
+ " \"descrip\": \"High Heeled \\\"Ruby\\\" Slippers\", \n" + " \"quantity\": 1, \n"
+ " \"price\": 100.27, \n" + " \"size\": 8\n"
+ " \"quantity\": 1, \n" + " }\n"
+ " \"size\": 8\n" + " ], \n"
+ " }\n" + " \"receipt\": \"Oz-Ware Purchase Invoice\", \n"
+ " ], \n" + " \"specialDelivery\": \"Follow the Yellow Brick Road to the Emerald City. Pay no attention to the man behind the curtain.\"\n"
+ " \"receipt\": \"Oz-Ware Purchase Invoice\", \n" + "}",
+ " \"specialDelivery\": \"Follow the Yellow Brick Road to the Emerald City. Pay no attention to the man behind the curtain.\"\n" // numberTest
+ "}", ""
// numberTest + "{\n"
"" + " \"someKey\": {\n"
+ "{\n" + " \"1\": 1, \n"
+ " \"someKey\": {\n" + " \"2\": 2, \n"
+ " \"1\": 1, \n" + " \"3\": 3, \n"
+ " \"2\": 2, \n" + " \"4\": 4\n"
+ " \"3\": 3, \n" + " }\n"
+ " \"4\": 4\n" + "}",
+ " }\n" // nullTest
+ "}", ""
// nullTest + "{\n"
"" + " \"null\": {\n"
+ "{\n" + " \"null\": \"object\", \n"
+ " \"null\": {\n" + " \"object\": null\n"
+ " \"null\": \"object\", \n" + " }\n"
+ " \"object\": null\n" + "}"
+ " }\n" )
+ "}" );
}
} );
// CHECKSTYLE:ON
} }
//
private final Class<? extends ConfigurationProvider> provider;
private final String testDocument;
private final String numberTest;
private final String nullTest;
@Test @ParameterizedTest
public void testConfig() throws Exception @MethodSource("data")
public void testConfig(Class<? extends ConfigurationProvider> provider, String testDocument, String numberTest, String nullTest) throws Exception
{ {
Configuration conf = ConfigurationProvider.getProvider( provider ).load( testDocument ); Configuration conf = ConfigurationProvider.getProvider( provider ).load( testDocument );
testSection( conf ); testSection( conf );
@ -151,7 +141,7 @@ public class CompoundConfigurationTest
ConfigurationProvider.getProvider( provider ).save( conf, sw ); ConfigurationProvider.getProvider( provider ).save( conf, sw );
// Check nulls were saved, see #1094 // Check nulls were saved, see #1094
Assert.assertFalse( "Config contains null", sw.toString().contains( "null" ) ); assertFalse( sw.toString().contains( "null" ), "Config contains null" );
conf = ConfigurationProvider.getProvider( provider ).load( new StringReader( sw.toString() ) ); conf = ConfigurationProvider.getProvider( provider ).load( new StringReader( sw.toString() ) );
conf.set( "receipt", "Oz-Ware Purchase Invoice" ); // Add it back conf.set( "receipt", "Oz-Ware Purchase Invoice" ); // Add it back
@ -160,37 +150,38 @@ public class CompoundConfigurationTest
private void testSection(Configuration conf) private void testSection(Configuration conf)
{ {
Assert.assertEquals( "receipt", "Oz-Ware Purchase Invoice", conf.getString( "receipt" ) ); assertEquals( "Oz-Ware Purchase Invoice", conf.getString( "receipt" ), "receipt" );
// Assert.assertEquals( "date", "2012-08-06", conf.get( "date" ).toString() ); // assertEquals( "2012-08-06", conf.get( "date" ).toString(), "date" );
Configuration customer = conf.getSection( "customer" ); Configuration customer = conf.getSection( "customer" );
Assert.assertEquals( "customer.given", "Dorothy", customer.getString( "given" ) ); assertEquals( "Dorothy", customer.getString( "given" ), "customer.given" );
Assert.assertEquals( "customer.given", "Dorothy", conf.getString( "customer.given" ) ); assertEquals( "Dorothy", conf.getString( "customer.given" ), "customer.given" );
List items = conf.getList( "items" ); List items = conf.getList( "items" );
Map item = (Map) items.get( 0 ); Map item = (Map) items.get( 0 );
Assert.assertEquals( "items[0].part_no", "A4786", item.get( "part_no" ) ); assertEquals( "A4786", item.get( "part_no" ), "items[0].part_no" );
conf.set( "receipt", null ); conf.set( "receipt", null );
Assert.assertEquals( null, conf.get( "receipt" ) ); assertEquals( null, conf.get( "receipt" ) );
Assert.assertEquals( "foo", conf.get( "receipt", "foo" ) ); assertEquals( "foo", conf.get( "receipt", "foo" ) );
Configuration newSection = conf.getSection( "new.section" ); Configuration newSection = conf.getSection( "new.section" );
newSection.set( "value", "foo" ); newSection.set( "value", "foo" );
Assert.assertEquals( "foo", conf.get( "new.section.value" ) ); assertEquals( "foo", conf.get( "new.section.value" ) );
conf.set( "other.new.section", "bar" ); conf.set( "other.new.section", "bar" );
Assert.assertEquals( "bar", conf.get( "other.new.section" ) ); assertEquals( "bar", conf.get( "other.new.section" ) );
Assert.assertTrue( conf.contains( "customer.given" ) ); assertTrue( conf.contains( "customer.given" ) );
Assert.assertTrue( customer.contains( "given" ) ); assertTrue( customer.contains( "given" ) );
Assert.assertFalse( conf.contains( "customer.foo" ) ); assertFalse( conf.contains( "customer.foo" ) );
Assert.assertFalse( customer.contains( "foo" ) ); assertFalse( customer.contains( "foo" ) );
} }
@Test @ParameterizedTest
public void testNumberedKeys() @MethodSource("data")
public void testNumberedKeys(Class<? extends ConfigurationProvider> provider, String testDocument, String numberTest, String nullTest)
{ {
Configuration conf = ConfigurationProvider.getProvider( provider ).load( numberTest ); Configuration conf = ConfigurationProvider.getProvider( provider ).load( numberTest );
@ -201,29 +192,31 @@ public class CompoundConfigurationTest
} }
} }
@Test @ParameterizedTest
public void testNull() @MethodSource("data")
public void testNull(Class<? extends ConfigurationProvider> provider, String testDocument, String numberTest, String nullTest)
{ {
Configuration conf = ConfigurationProvider.getProvider( provider ).load( nullTest ); Configuration conf = ConfigurationProvider.getProvider( provider ).load( nullTest );
Assert.assertEquals( "object", conf.get( "null.null" ) ); assertEquals( "object", conf.get( "null.null" ) );
Assert.assertEquals( "object", conf.getSection( "null" ).get( "null" ) ); assertEquals( "object", conf.getSection( "null" ).get( "null" ) );
Assert.assertEquals( null, conf.get( "null.object" ) ); assertEquals( null, conf.get( "null.object" ) );
Assert.assertEquals( "", conf.getString( "null.object" ) ); assertEquals( "", conf.getString( "null.object" ) );
} }
@Test @ParameterizedTest
public void testMapAddition() @MethodSource("data")
public void testMapAddition(Class<? extends ConfigurationProvider> provider, String testDocument, String numberTest, String nullTest)
{ {
Configuration conf = ConfigurationProvider.getProvider( provider ).load( testDocument ); Configuration conf = ConfigurationProvider.getProvider( provider ).load( testDocument );
conf.set( "addition", Collections.singletonMap( "foo", "bar" ) ); conf.set( "addition", Collections.singletonMap( "foo", "bar" ) );
// Order matters // Order matters
Assert.assertEquals( "bar", conf.getSection( "addition" ).getString( "foo" ) ); assertEquals( "bar", conf.getSection( "addition" ).getString( "foo" ) );
Assert.assertEquals( "bar", conf.getString( "addition.foo" ) ); assertEquals( "bar", conf.getString( "addition.foo" ) );
Assert.assertTrue( conf.get( "addition" ) instanceof Configuration ); assertTrue( conf.get( "addition" ) instanceof Configuration );
} }
} }

View File

@ -1,7 +1,7 @@
package net.md_5.bungee.config; package net.md_5.bungee.config;
import org.junit.Assert; import static org.junit.jupiter.api.Assertions.*;
import org.junit.Test; import org.junit.jupiter.api.Test;
public class DefaultConfigurationTest public class DefaultConfigurationTest
{ {
@ -16,8 +16,8 @@ public class DefaultConfigurationTest
Configuration actualConfig = new Configuration( defaultConfig ); Configuration actualConfig = new Configuration( defaultConfig );
Assert.assertEquals( 10, actualConfig.getInt( "setting" ) ); assertEquals( 10, actualConfig.getInt( "setting" ) );
Assert.assertEquals( 11, actualConfig.getInt( "nested.setting" ) ); assertEquals( 11, actualConfig.getInt( "nested.setting" ) );
Assert.assertEquals( 12, actualConfig.getInt( "double.nested.setting" ) ); assertEquals( 12, actualConfig.getInt( "double.nested.setting" ) );
} }
} }

View File

@ -1,8 +1,8 @@
package net.md_5.bungee.event; package net.md_5.bungee.event;
import static org.junit.jupiter.api.Assertions.*;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import org.junit.Assert; import org.junit.jupiter.api.Test;
import org.junit.Test;
public class EventBusTest public class EventBusTest
{ {
@ -15,14 +15,14 @@ public class EventBusTest
{ {
bus.register( this ); bus.register( this );
bus.post( new FirstEvent() ); bus.post( new FirstEvent() );
Assert.assertEquals( 0, latch.getCount() ); assertEquals( 0, latch.getCount() );
} }
@EventHandler @EventHandler
public void firstListener(FirstEvent event) public void firstListener(FirstEvent event)
{ {
bus.post( new SecondEvent() ); bus.post( new SecondEvent() );
Assert.assertEquals( 1, latch.getCount() ); assertEquals( 1, latch.getCount() );
latch.countDown(); latch.countDown();
} }

View File

@ -1,8 +1,8 @@
package net.md_5.bungee.event; package net.md_5.bungee.event;
import static org.junit.jupiter.api.Assertions.*;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import org.junit.Assert; import org.junit.jupiter.api.Test;
import org.junit.Test;
public class EventPriorityTest public class EventPriorityTest
{ {
@ -16,41 +16,41 @@ public class EventPriorityTest
bus.register( this ); bus.register( this );
bus.register( new EventPriorityListenerPartner() ); bus.register( new EventPriorityListenerPartner() );
bus.post( new PriorityTestEvent() ); bus.post( new PriorityTestEvent() );
Assert.assertEquals( 0, latch.getCount() ); assertEquals( 0, latch.getCount() );
} }
@EventHandler(priority = Byte.MIN_VALUE) @EventHandler(priority = Byte.MIN_VALUE)
public void onMinPriority(PriorityTestEvent event) public void onMinPriority(PriorityTestEvent event)
{ {
Assert.assertEquals( 7, latch.getCount() ); assertEquals( 7, latch.getCount() );
latch.countDown(); latch.countDown();
} }
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.LOWEST)
public void onLowestPriority(PriorityTestEvent event) public void onLowestPriority(PriorityTestEvent event)
{ {
Assert.assertEquals( 6, latch.getCount() ); assertEquals( 6, latch.getCount() );
latch.countDown(); latch.countDown();
} }
@EventHandler @EventHandler
public void onNormalPriority(PriorityTestEvent event) public void onNormalPriority(PriorityTestEvent event)
{ {
Assert.assertEquals( 4, latch.getCount() ); assertEquals( 4, latch.getCount() );
latch.countDown(); latch.countDown();
} }
@EventHandler(priority = EventPriority.HIGHEST) @EventHandler(priority = EventPriority.HIGHEST)
public void onHighestPriority(PriorityTestEvent event) public void onHighestPriority(PriorityTestEvent event)
{ {
Assert.assertEquals( 2, latch.getCount() ); assertEquals( 2, latch.getCount() );
latch.countDown(); latch.countDown();
} }
@EventHandler(priority = Byte.MAX_VALUE) @EventHandler(priority = Byte.MAX_VALUE)
public void onMaxPriority(PriorityTestEvent event) public void onMaxPriority(PriorityTestEvent event)
{ {
Assert.assertEquals( 1, latch.getCount() ); assertEquals( 1, latch.getCount() );
latch.countDown(); latch.countDown();
} }
@ -64,14 +64,14 @@ public class EventPriorityTest
@EventHandler(priority = EventPriority.HIGH) @EventHandler(priority = EventPriority.HIGH)
public void onHighPriority(PriorityTestEvent event) public void onHighPriority(PriorityTestEvent event)
{ {
Assert.assertEquals( 3, latch.getCount() ); assertEquals( 3, latch.getCount() );
latch.countDown(); latch.countDown();
} }
@EventHandler(priority = EventPriority.LOW) @EventHandler(priority = EventPriority.LOW)
public void onLowPriority(PriorityTestEvent event) public void onLowPriority(PriorityTestEvent event)
{ {
Assert.assertEquals( 5, latch.getCount() ); assertEquals( 5, latch.getCount() );
latch.countDown(); latch.countDown();
} }
} }

View File

@ -1,8 +1,8 @@
package net.md_5.bungee.event; package net.md_5.bungee.event;
import static org.junit.jupiter.api.Assertions.*;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import org.junit.Assert; import org.junit.jupiter.api.Test;
import org.junit.Test;
public class SubclassTest extends EventBusTest public class SubclassTest extends EventBusTest
{ {
@ -14,13 +14,13 @@ public class SubclassTest extends EventBusTest
public void testNestedEvents() public void testNestedEvents()
{ {
super.testNestedEvents(); super.testNestedEvents();
Assert.assertEquals( 0, latch.getCount() ); assertEquals( 0, latch.getCount() );
} }
@EventHandler @EventHandler
protected void extraListener(FirstEvent event) protected void extraListener(FirstEvent event)
{ {
Assert.assertEquals( 1, latch.getCount() ); assertEquals( 1, latch.getCount() );
latch.countDown(); latch.countDown();
} }
} }

View File

@ -1,7 +1,7 @@
package net.md_5.bungee.event; package net.md_5.bungee.event;
import org.junit.Assert; import static org.junit.jupiter.api.Assertions.fail;
import org.junit.Test; import org.junit.jupiter.api.Test;
public class UnregisteringListenerTest public class UnregisteringListenerTest
{ {
@ -19,7 +19,7 @@ public class UnregisteringListenerTest
@EventHandler @EventHandler
public void onEvent(TestEvent evt) public void onEvent(TestEvent evt)
{ {
Assert.fail( "Event listener wasn't unregistered" ); fail( "Event listener wasn't unregistered" );
} }
public static class TestEvent public static class TestEvent

View File

@ -1,5 +1,6 @@
package net.md_5.bungee; package net.md_5.bungee;
import static org.junit.jupiter.api.Assertions.*;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
import java.util.Random; import java.util.Random;
@ -9,12 +10,11 @@ import net.md_5.bungee.jni.NativeCode;
import net.md_5.bungee.jni.cipher.BungeeCipher; import net.md_5.bungee.jni.cipher.BungeeCipher;
import net.md_5.bungee.jni.cipher.JavaCipher; import net.md_5.bungee.jni.cipher.JavaCipher;
import net.md_5.bungee.jni.cipher.NativeCipher; import net.md_5.bungee.jni.cipher.NativeCipher;
import org.junit.Assert; import org.junit.jupiter.api.MethodOrderer;
import org.junit.FixMethodOrder; import org.junit.jupiter.api.Test;
import org.junit.Test; import org.junit.jupiter.api.TestMethodOrder;
import org.junit.runners.MethodSorters;
@FixMethodOrder(MethodSorters.NAME_ASCENDING) @TestMethodOrder(MethodOrderer.MethodName.class)
public class NativeCipherTest public class NativeCipherTest
{ {
@ -34,7 +34,7 @@ public class NativeCipherTest
if ( NativeCode.isSupported() ) if ( NativeCode.isSupported() )
{ {
boolean loaded = factory.load(); boolean loaded = factory.load();
Assert.assertTrue( "Native cipher failed to load!", loaded ); assertTrue( loaded, "Native cipher failed to load!" );
NativeCipher cipher = new NativeCipher(); NativeCipher cipher = new NativeCipher();
System.out.println( "Testing native cipher..." ); System.out.println( "Testing native cipher..." );
@ -48,7 +48,7 @@ public class NativeCipherTest
if ( NativeCode.isSupported() ) if ( NativeCode.isSupported() )
{ {
boolean loaded = factory.load(); boolean loaded = factory.load();
Assert.assertTrue( "Native cipher failed to load!", loaded ); assertTrue( loaded, "Native cipher failed to load!" );
NativeCipher cipher = new NativeCipher(); NativeCipher cipher = new NativeCipher();
@ -98,7 +98,7 @@ public class NativeCipherTest
// Encrypt // Encrypt
cipher.init( true, secret ); cipher.init( true, secret );
cipher.cipher( nativePlain, out ); cipher.cipher( nativePlain, out );
Assert.assertEquals( nativeCiphered, out ); assertEquals( nativeCiphered, out );
out.clear(); out.clear();
@ -106,7 +106,7 @@ public class NativeCipherTest
cipher.init( false, secret ); cipher.init( false, secret );
cipher.cipher( nativeCiphered, out ); cipher.cipher( nativeCiphered, out );
nativePlain.resetReaderIndex(); nativePlain.resetReaderIndex();
Assert.assertEquals( nativePlain, out ); assertEquals( nativePlain, out );
System.out.println( "This cipher works correctly!" ); System.out.println( "This cipher works correctly!" );
} }

View File

@ -1,5 +1,6 @@
package net.md_5.bungee; package net.md_5.bungee;
import static org.junit.jupiter.api.Assertions.*;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
import java.util.Arrays; import java.util.Arrays;
@ -9,8 +10,7 @@ import net.md_5.bungee.jni.NativeCode;
import net.md_5.bungee.jni.zlib.BungeeZlib; import net.md_5.bungee.jni.zlib.BungeeZlib;
import net.md_5.bungee.jni.zlib.JavaZlib; import net.md_5.bungee.jni.zlib.JavaZlib;
import net.md_5.bungee.jni.zlib.NativeZlib; import net.md_5.bungee.jni.zlib.NativeZlib;
import org.junit.Assert; import org.junit.jupiter.api.Test;
import org.junit.Test;
public class NativeZlibTest public class NativeZlibTest
{ {
@ -22,7 +22,7 @@ public class NativeZlibTest
{ {
if ( NativeCode.isSupported() ) if ( NativeCode.isSupported() )
{ {
Assert.assertTrue( "Native code failed to load!", factory.load() ); assertTrue( factory.load(), "Native code failed to load!" );
test( factory.newInstance() ); test( factory.newInstance() );
} }
test( new JavaZlib() ); test( new JavaZlib() );
@ -64,6 +64,6 @@ public class NativeZlibTest
long elapsed = System.currentTimeMillis() - start; long elapsed = System.currentTimeMillis() - start;
System.out.println( "Took: " + elapsed + "ms" ); System.out.println( "Took: " + elapsed + "ms" );
Assert.assertTrue( "Results do not match", Arrays.equals( dataBuf, check ) ); assertTrue( Arrays.equals( dataBuf, check ), "Results do not match" );
} }
} }

View File

@ -91,9 +91,9 @@
</dependencyManagement> </dependencyManagement>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>junit</groupId> <groupId>org.junit.jupiter</groupId>
<artifactId>junit</artifactId> <artifactId>junit-jupiter</artifactId>
<version>4.13.2</version> <version>5.10.0</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>

View File

@ -15,6 +15,7 @@ public class MinecraftEncoder extends MessageToByteEncoder<DefinedPacket>
@Setter @Setter
private Protocol protocol; private Protocol protocol;
private boolean server; private boolean server;
@Getter
@Setter @Setter
private int protocolVersion; private int protocolVersion;

View File

@ -658,8 +658,8 @@ public enum Protocol
/*========================================================================*/ /*========================================================================*/
public static final int MAX_PACKET_ID = 0xFF; public static final int MAX_PACKET_ID = 0xFF;
/*========================================================================*/ /*========================================================================*/
final DirectionData TO_SERVER = new DirectionData( this, ProtocolConstants.Direction.TO_SERVER ); public final DirectionData TO_SERVER = new DirectionData( this, ProtocolConstants.Direction.TO_SERVER );
final DirectionData TO_CLIENT = new DirectionData( this, ProtocolConstants.Direction.TO_CLIENT ); public final DirectionData TO_CLIENT = new DirectionData( this, ProtocolConstants.Direction.TO_CLIENT );
public static void main(String[] args) public static void main(String[] args)
{ {
@ -719,7 +719,7 @@ public enum Protocol
return new ProtocolMapping( protocol, id ); return new ProtocolMapping( protocol, id );
} }
static final class DirectionData public static final class DirectionData
{ {
private final TIntObjectMap<ProtocolData> protocols = new TIntObjectHashMap<>(); private final TIntObjectMap<ProtocolData> protocols = new TIntObjectHashMap<>();
@ -802,6 +802,17 @@ public enum Protocol
} }
} }
public boolean hasPacket(Class<? extends DefinedPacket> packet, int version)
{
ProtocolData protocolData = getProtocolData( version );
if ( protocolData == null )
{
throw new BadPacketException( "Unsupported protocol version" );
}
return protocolData.packetMap.containsKey( packet );
}
final int getId(Class<? extends DefinedPacket> packet, int version) final int getId(Class<? extends DefinedPacket> packet, int version)
{ {

View File

@ -1,7 +1,7 @@
package net.md_5.bungee.protocol.packet; package net.md_5.bungee.protocol.packet;
import org.junit.Assert; import static org.junit.jupiter.api.Assertions.*;
import org.junit.Test; import org.junit.jupiter.api.Test;
public class PluginMessageTest public class PluginMessageTest
{ {
@ -9,9 +9,9 @@ public class PluginMessageTest
@Test @Test
public void testModerniseChannel() public void testModerniseChannel()
{ {
Assert.assertEquals( "bungeecord:main", PluginMessage.MODERNISE.apply( "BungeeCord" ) ); assertEquals( "bungeecord:main", PluginMessage.MODERNISE.apply( "BungeeCord" ) );
Assert.assertEquals( "BungeeCord", PluginMessage.MODERNISE.apply( "bungeecord:main" ) ); assertEquals( "BungeeCord", PluginMessage.MODERNISE.apply( "bungeecord:main" ) );
Assert.assertEquals( "legacy:foo", PluginMessage.MODERNISE.apply( "FoO" ) ); assertEquals( "legacy:foo", PluginMessage.MODERNISE.apply( "FoO" ) );
Assert.assertEquals( "foo:bar", PluginMessage.MODERNISE.apply( "foo:bar" ) ); assertEquals( "foo:bar", PluginMessage.MODERNISE.apply( "foo:bar" ) );
} }
} }

View File

@ -5,6 +5,7 @@ import java.net.InetSocketAddress;
import java.net.SocketAddress; import java.net.SocketAddress;
import java.util.ArrayDeque; import java.util.ArrayDeque;
import java.util.Queue; import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import lombok.Data; import lombok.Data;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -13,6 +14,7 @@ import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.connection.Server; import net.md_5.bungee.api.connection.Server;
import net.md_5.bungee.netty.ChannelWrapper; import net.md_5.bungee.netty.ChannelWrapper;
import net.md_5.bungee.protocol.DefinedPacket; import net.md_5.bungee.protocol.DefinedPacket;
import net.md_5.bungee.protocol.Protocol;
import net.md_5.bungee.protocol.packet.PluginMessage; import net.md_5.bungee.protocol.packet.PluginMessage;
@RequiredArgsConstructor @RequiredArgsConstructor
@ -30,6 +32,7 @@ public class ServerConnection implements Server
private final boolean forgeServer = false; private final boolean forgeServer = false;
@Getter @Getter
private final Queue<KeepAliveData> keepAlives = new ArrayDeque<>(); private final Queue<KeepAliveData> keepAlives = new ArrayDeque<>();
private final Queue<DefinedPacket> packetQueue = new ConcurrentLinkedQueue<>();
private final Unsafe unsafe = new Unsafe() private final Unsafe unsafe = new Unsafe()
{ {
@ -40,10 +43,31 @@ public class ServerConnection implements Server
} }
}; };
public void sendPacketQueued(DefinedPacket packet)
{
Protocol encodeProtocol = ch.getEncodeProtocol();
if ( !encodeProtocol.TO_SERVER.hasPacket( packet.getClass(), ch.getEncodeVersion() ) )
{
packetQueue.add( packet );
} else
{
unsafe().sendPacket( packet );
}
}
public void sendQueuedPackets()
{
DefinedPacket packet;
while ( ( packet = packetQueue.poll() ) != null )
{
unsafe().sendPacket( packet );
}
}
@Override @Override
public void sendData(String channel, byte[] data) public void sendData(String channel, byte[] data)
{ {
unsafe().sendPacket( new PluginMessage( channel, data, forgeServer ) ); sendPacketQueued( new PluginMessage( channel, data, forgeServer ) );
} }
@Override @Override

View File

@ -20,6 +20,7 @@ import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Queue; import java.util.Queue;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.logging.Level; import java.util.logging.Level;
import lombok.Getter; import lombok.Getter;
import lombok.NonNull; import lombok.NonNull;
@ -142,6 +143,7 @@ public final class UserConnection implements ProxiedPlayer
@Setter @Setter
private ForgeServerHandler forgeServerHandler; private ForgeServerHandler forgeServerHandler;
/*========================================================================*/ /*========================================================================*/
private final Queue<DefinedPacket> packetQueue = new ConcurrentLinkedQueue<>();
private final Unsafe unsafe = new Unsafe() private final Unsafe unsafe = new Unsafe()
{ {
@Override @Override
@ -177,6 +179,27 @@ public final class UserConnection implements ProxiedPlayer
ch.write( packet ); ch.write( packet );
} }
public void sendPacketQueued(DefinedPacket packet)
{
Protocol encodeProtocol = ch.getEncodeProtocol();
if ( !encodeProtocol.TO_CLIENT.hasPacket( packet.getClass(), getPendingConnection().getVersion() ) )
{
packetQueue.add( packet );
} else
{
unsafe().sendPacket( packet );
}
}
public void sendQueuedPackets()
{
DefinedPacket packet;
while ( ( packet = packetQueue.poll() ) != null )
{
unsafe().sendPacket( packet );
}
}
@Deprecated @Deprecated
public boolean isActive() public boolean isActive()
{ {
@ -489,10 +512,10 @@ public final class UserConnection implements ProxiedPlayer
position = ChatMessageType.SYSTEM; position = ChatMessageType.SYSTEM;
} }
unsafe().sendPacket( new SystemChat( message, position.ordinal() ) ); sendPacketQueued( new SystemChat( message, position.ordinal() ) );
} else } else
{ {
unsafe().sendPacket( new Chat( message, (byte) position.ordinal(), sender ) ); sendPacketQueued( new Chat( message, (byte) position.ordinal(), sender ) );
} }
} }
@ -513,7 +536,7 @@ public final class UserConnection implements ProxiedPlayer
net.md_5.bungee.protocol.packet.Title title = new net.md_5.bungee.protocol.packet.Title(); net.md_5.bungee.protocol.packet.Title title = new net.md_5.bungee.protocol.packet.Title();
title.setAction( net.md_5.bungee.protocol.packet.Title.Action.ACTIONBAR ); title.setAction( net.md_5.bungee.protocol.packet.Title.Action.ACTIONBAR );
title.setText( ComponentSerializer.toString( message ) ); title.setText( ComponentSerializer.toString( message ) );
unsafe.sendPacket( title ); sendPacketQueued( title );
} }
} else } else
{ {
@ -524,7 +547,7 @@ public final class UserConnection implements ProxiedPlayer
@Override @Override
public void sendData(String channel, byte[] data) public void sendData(String channel, byte[] data)
{ {
unsafe().sendPacket( new PluginMessage( channel, data, forgeClientHandler.isForgeUser() ) ); sendPacketQueued( new PluginMessage( channel, data, forgeClientHandler.isForgeUser() ) );
} }
@Override @Override
@ -700,7 +723,7 @@ public final class UserConnection implements ProxiedPlayer
header = ChatComponentTransformer.getInstance().transform( this, true, header )[0]; header = ChatComponentTransformer.getInstance().transform( this, true, header )[0];
footer = ChatComponentTransformer.getInstance().transform( this, true, footer )[0]; footer = ChatComponentTransformer.getInstance().transform( this, true, footer )[0];
unsafe().sendPacket( new PlayerListHeaderFooter( sendPacketQueued( new PlayerListHeaderFooter(
ComponentSerializer.toString( header ), ComponentSerializer.toString( header ),
ComponentSerializer.toString( footer ) ComponentSerializer.toString( footer )
) ); ) );
@ -712,7 +735,7 @@ public final class UserConnection implements ProxiedPlayer
header = ChatComponentTransformer.getInstance().transform( this, true, header ); header = ChatComponentTransformer.getInstance().transform( this, true, header );
footer = ChatComponentTransformer.getInstance().transform( this, true, footer ); footer = ChatComponentTransformer.getInstance().transform( this, true, footer );
unsafe().sendPacket( new PlayerListHeaderFooter( sendPacketQueued( new PlayerListHeaderFooter(
ComponentSerializer.toString( header ), ComponentSerializer.toString( header ),
ComponentSerializer.toString( footer ) ComponentSerializer.toString( footer )
) ); ) );

View File

@ -31,6 +31,7 @@ import net.md_5.bungee.protocol.packet.Chat;
import net.md_5.bungee.protocol.packet.ClientChat; import net.md_5.bungee.protocol.packet.ClientChat;
import net.md_5.bungee.protocol.packet.ClientCommand; import net.md_5.bungee.protocol.packet.ClientCommand;
import net.md_5.bungee.protocol.packet.ClientSettings; import net.md_5.bungee.protocol.packet.ClientSettings;
import net.md_5.bungee.protocol.packet.FinishConfiguration;
import net.md_5.bungee.protocol.packet.KeepAlive; import net.md_5.bungee.protocol.packet.KeepAlive;
import net.md_5.bungee.protocol.packet.LoginAcknowledged; import net.md_5.bungee.protocol.packet.LoginAcknowledged;
import net.md_5.bungee.protocol.packet.PlayerListItem; import net.md_5.bungee.protocol.packet.PlayerListItem;
@ -330,10 +331,21 @@ public class UpstreamBridge extends PacketHandler
ch.setDecodeProtocol( Protocol.CONFIGURATION ); ch.setDecodeProtocol( Protocol.CONFIGURATION );
ch.write( new LoginAcknowledged() ); ch.write( new LoginAcknowledged() );
ch.setEncodeProtocol( Protocol.CONFIGURATION ); ch.setEncodeProtocol( Protocol.CONFIGURATION );
con.getServer().sendQueuedPackets();
throw CancelSendSignal.INSTANCE; throw CancelSendSignal.INSTANCE;
} }
} }
@Override
public void handle(FinishConfiguration finishConfiguration) throws Exception
{
con.sendQueuedPackets();
super.handle( finishConfiguration );
}
@Override @Override
public String toString() public String toString()
{ {

View File

@ -69,6 +69,11 @@ public class ChannelWrapper
ch.pipeline().get( MinecraftEncoder.class ).setProtocolVersion( protocol ); ch.pipeline().get( MinecraftEncoder.class ).setProtocolVersion( protocol );
} }
public int getEncodeVersion()
{
return ch.pipeline().get( MinecraftEncoder.class ).getProtocolVersion();
}
public void write(Object packet) public void write(Object packet)
{ {
if ( !closed ) if ( !closed )

View File

@ -1,12 +1,12 @@
package net.md_5.bungee; package net.md_5.bungee;
import static org.junit.jupiter.api.Assertions.*;
import com.google.common.base.Ticker; import com.google.common.base.Ticker;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.junit.Assert; import org.junit.jupiter.api.Test;
import org.junit.Test;
public class ThrottleTest public class ThrottleTest
{ {
@ -38,18 +38,18 @@ public class ThrottleTest
address = new InetSocketAddress( InetAddress.getByName( null ), 0 ); address = new InetSocketAddress( InetAddress.getByName( null ), 0 );
} }
Assert.assertFalse( "Address should not be throttled", throttle.throttle( address ) ); // 1 assertFalse( throttle.throttle( address ), "Address should not be throttled" ); // 1
Assert.assertFalse( "Address should not be throttled", throttle.throttle( address ) ); // 2 assertFalse( throttle.throttle( address ), "Address should not be throttled" ); // 2
Assert.assertFalse( "Address should not be throttled", throttle.throttle( address ) ); // 3 assertFalse( throttle.throttle( address ), "Address should not be throttled" ); // 3
Assert.assertTrue( "Address should be throttled", throttle.throttle( address ) ); // The 3rd one must be throttled, but also increased the count to 4 assertTrue( throttle.throttle( address ), "Address should be throttled" ); // The 3rd one must be throttled, but also increased the count to 4
throttle.unthrottle( address ); // We are back at 3, next attempt will make it 4 and throttle throttle.unthrottle( address ); // We are back at 3, next attempt will make it 4 and throttle
throttle.unthrottle( address ); // Now we are at 2, will not be throttled throttle.unthrottle( address ); // Now we are at 2, will not be throttled
Assert.assertFalse( "Address should not be throttled", throttle.throttle( address ) ); // 3 assertFalse( throttle.throttle( address ), "Address should not be throttled" ); // 3
Assert.assertTrue( "Address should be throttled", throttle.throttle( address ) ); // 4 assertTrue( throttle.throttle( address ), "Address should be throttled" ); // 4
// Now test expiration // Now test expiration
ticker.value += TimeUnit.MILLISECONDS.toNanos( 50 ); ticker.value += TimeUnit.MILLISECONDS.toNanos( 50 );
Assert.assertFalse( "Address should not be throttled", throttle.throttle( address ) ); assertFalse( throttle.throttle( address ), "Address should not be throttled" );
} }
} }

View File

@ -1,13 +1,13 @@
package net.md_5.bungee.scheduler; package net.md_5.bungee.scheduler;
import static org.junit.jupiter.api.Assertions.*;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import net.md_5.bungee.api.plugin.DummyPlugin; import net.md_5.bungee.api.plugin.DummyPlugin;
import net.md_5.bungee.api.scheduler.ScheduledTask; import net.md_5.bungee.api.scheduler.ScheduledTask;
import net.md_5.bungee.api.scheduler.TaskScheduler; import net.md_5.bungee.api.scheduler.TaskScheduler;
import org.junit.Assert; import org.junit.jupiter.api.Test;
import org.junit.Test;
public class SchedulerTest public class SchedulerTest
{ {
@ -31,7 +31,7 @@ public class SchedulerTest
latch.await( 5, TimeUnit.SECONDS ); latch.await( 5, TimeUnit.SECONDS );
Assert.assertEquals( 0, latch.getCount() ); assertEquals( 0, latch.getCount() );
} }
@Test @Test
@ -43,17 +43,17 @@ public class SchedulerTest
ScheduledTask task = setup( scheduler, b ); ScheduledTask task = setup( scheduler, b );
scheduler.cancel( task.getId() ); scheduler.cancel( task.getId() );
Thread.sleep( 250 ); Thread.sleep( 250 );
Assert.assertFalse( b.get() ); assertFalse( b.get() );
task = setup( scheduler, b ); task = setup( scheduler, b );
scheduler.cancel( task ); scheduler.cancel( task );
Thread.sleep( 250 ); Thread.sleep( 250 );
Assert.assertFalse( b.get() ); assertFalse( b.get() );
task = setup( scheduler, b ); task = setup( scheduler, b );
scheduler.cancel( task.getOwner() ); scheduler.cancel( task.getOwner() );
Thread.sleep( 250 ); Thread.sleep( 250 );
Assert.assertFalse( b.get() ); assertFalse( b.get() );
} }
@Test @Test
@ -64,11 +64,11 @@ public class SchedulerTest
setup( scheduler, b ); setup( scheduler, b );
Thread.sleep( 250 ); Thread.sleep( 250 );
Assert.assertTrue( b.get() ); assertTrue( b.get() );
b.set( false ); b.set( false );
Thread.sleep( 250 ); Thread.sleep( 250 );
Assert.assertTrue( b.get() ); assertTrue( b.get() );
} }
private ScheduledTask setup(TaskScheduler scheduler, final AtomicBoolean hasRun) private ScheduledTask setup(TaskScheduler scheduler, final AtomicBoolean hasRun)

View File

@ -1,8 +1,8 @@
package net.md_5.bungee.util; package net.md_5.bungee.util;
import static org.junit.jupiter.api.Assertions.*;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import org.junit.Assert; import org.junit.jupiter.api.Test;
import org.junit.Test;
public class AddressUtilTest public class AddressUtilTest
{ {
@ -11,9 +11,9 @@ public class AddressUtilTest
public void testScope() public void testScope()
{ {
InetSocketAddress addr = new InetSocketAddress( "0:0:0:0:0:0:0:1%0", 25577 ); InetSocketAddress addr = new InetSocketAddress( "0:0:0:0:0:0:0:1%0", 25577 );
Assert.assertEquals( "0:0:0:0:0:0:0:1", AddressUtil.sanitizeAddress( addr ) ); assertEquals( "0:0:0:0:0:0:0:1", AddressUtil.sanitizeAddress( addr ) );
InetSocketAddress addr2 = new InetSocketAddress( "0:0:0:0:0:0:0:1", 25577 ); InetSocketAddress addr2 = new InetSocketAddress( "0:0:0:0:0:0:0:1", 25577 );
Assert.assertEquals( "0:0:0:0:0:0:0:1", AddressUtil.sanitizeAddress( addr2 ) ); assertEquals( "0:0:0:0:0:0:0:1", AddressUtil.sanitizeAddress( addr2 ) );
} }
} }