Adeed WorldTime module tests.
This commit is contained in:
parent
1bbc710897
commit
0d716b0bb3
2 changed files with 111 additions and 46 deletions
|
@ -32,6 +32,9 @@
|
|||
package net.thauvin.erik.mobibot.modules;
|
||||
|
||||
import net.thauvin.erik.mobibot.Mobibot;
|
||||
import net.thauvin.erik.mobibot.msg.ErrorMessage;
|
||||
import net.thauvin.erik.mobibot.msg.Message;
|
||||
import net.thauvin.erik.mobibot.msg.PublicMessage;
|
||||
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZonedDateTime;
|
||||
|
@ -48,23 +51,17 @@ import java.util.TreeMap;
|
|||
* @since 1.0
|
||||
*/
|
||||
public final class WorldTime extends AbstractModule {
|
||||
/**
|
||||
* The time command.
|
||||
*/
|
||||
public static final String TIME_CMD = "time";
|
||||
|
||||
// The beats (Internet Time) keyword.
|
||||
private static final String BEATS_KEYWORD = ".beats";
|
||||
|
||||
// The supported countries.
|
||||
private static final Map<String, String> COUNTRIES_MAP = new TreeMap<>();
|
||||
|
||||
/**
|
||||
* Creates a new {@link WorldTime} instance.
|
||||
* The time command.
|
||||
*/
|
||||
public WorldTime() {
|
||||
commands.add(TIME_CMD);
|
||||
private static final String TIME_CMD = "time";
|
||||
|
||||
static {
|
||||
// Initialize the countries map
|
||||
COUNTRIES_MAP.put("AE", "Asia/Dubai");
|
||||
COUNTRIES_MAP.put("AF", "Asia/Kabul");
|
||||
|
@ -148,17 +145,26 @@ public final class WorldTime extends AbstractModule {
|
|||
}
|
||||
|
||||
/**
|
||||
* Responds with the current time in the specified timezone/country.
|
||||
*
|
||||
* @param bot The bot's instance.
|
||||
* @param sender The sender.
|
||||
* @param args The command arguments.
|
||||
* @param isPrivate Set to <code>true</code> if the response should be sent as a private message.
|
||||
* Creates a new {@link WorldTime} instance.
|
||||
*/
|
||||
@Override
|
||||
public void commandResponse(final Mobibot bot, final String sender, final String args, final boolean isPrivate) {
|
||||
boolean isInvalidTz = false;
|
||||
final String tz = (COUNTRIES_MAP.get((args.substring(args.indexOf(' ') + 1).trim().toUpperCase())));
|
||||
public WorldTime() {
|
||||
commands.add(TIME_CMD);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current Internet (beat) Time.
|
||||
*
|
||||
* @return The Internet Time string.
|
||||
*/
|
||||
private static String internetTime() {
|
||||
final ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("UTC+01:00"));
|
||||
final int beats = (int) ((zdt.get(ChronoField.SECOND_OF_MINUTE) + (zdt.get(ChronoField.MINUTE_OF_HOUR) * 60)
|
||||
+ (zdt.get(ChronoField.HOUR_OF_DAY) * 3600)) / 86.4);
|
||||
return String.format("%c%03d", '@', beats);
|
||||
}
|
||||
|
||||
static Message worldTime(String query) {
|
||||
final String tz = (COUNTRIES_MAP.get((query.substring(query.indexOf(' ') + 1).trim().toUpperCase())));
|
||||
final String response;
|
||||
|
||||
if (tz != null) {
|
||||
|
@ -170,17 +176,31 @@ public final class WorldTime extends AbstractModule {
|
|||
+ tz.substring(tz.indexOf('/') + 1).replace('_', ' ');
|
||||
}
|
||||
} else {
|
||||
isInvalidTz = true;
|
||||
response = "The supported countries/zones are: " + COUNTRIES_MAP.keySet().toString();
|
||||
return new ErrorMessage("The supported countries/zones are: " + COUNTRIES_MAP.keySet().toString());
|
||||
}
|
||||
|
||||
return new PublicMessage(response);
|
||||
}
|
||||
|
||||
/**
|
||||
* Responds with the current time in the specified timezone/country.
|
||||
*
|
||||
* @param bot The bot's instance.
|
||||
* @param sender The sender.
|
||||
* @param args The command arguments.
|
||||
* @param isPrivate Set to <code>true</code> if the response should be sent as a private message.
|
||||
*/
|
||||
@Override
|
||||
public void commandResponse(final Mobibot bot, final String sender, final String args, final boolean isPrivate) {
|
||||
final Message msg = worldTime(args);
|
||||
|
||||
if (isPrivate) {
|
||||
bot.send(sender, response, true);
|
||||
bot.send(sender, msg.getMessage(), true);
|
||||
} else {
|
||||
if (isInvalidTz) {
|
||||
bot.send(sender, response);
|
||||
if (msg.isError()) {
|
||||
bot.send(sender, msg.getMessage());
|
||||
} else {
|
||||
bot.send(bot.getChannel(), response);
|
||||
bot.send(bot.getChannel(), msg.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -197,18 +217,6 @@ public final class WorldTime extends AbstractModule {
|
|||
bot.send(sender, bot.helpIndent(bot.getNick() + ": " + TIME_CMD));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current Internet (beat) Time.
|
||||
*
|
||||
* @return The Internet Time string.
|
||||
*/
|
||||
private String internetTime() {
|
||||
final ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("UTC+01:00"));
|
||||
final int beats = (int) ((zdt.get(ChronoField.SECOND_OF_MINUTE) + (zdt.get(ChronoField.MINUTE_OF_HOUR) * 60)
|
||||
+ (zdt.get(ChronoField.HOUR_OF_DAY) * 3600)) / 86.4);
|
||||
return String.format("%c%03d", '@', beats);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
|
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* WordTimeTest.java
|
||||
*
|
||||
* Copyright (c) 2004-2019, Erik C. Thauvin (erik@thauvin.net)
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* Neither the name of this project nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package net.thauvin.erik.mobibot.modules;
|
||||
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* The <code>WordTimeTest</code> class.
|
||||
*
|
||||
* @author <a href="https://erik.thauvin.net/" target="_blank">Erik C. Thauvin</a>
|
||||
* @created 2019-04-07
|
||||
* @since 1.0
|
||||
*/
|
||||
public class WordTimeTest {
|
||||
@Test
|
||||
public void testWorldTimeImpl() {
|
||||
AbstractModuleTest.testAbstractModule(new Lookup());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWorldTime() {
|
||||
assertThat(WorldTime.worldTime("PST").getMessage()).as("PST").startsWith("The time is ");
|
||||
assertThat(WorldTime.worldTime("BLAH").isError()).as("BLAH").isTrue();
|
||||
assertThat(WorldTime.worldTime("BEATS").getMessage()).as("BEATS").contains("@");
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue