/** * Copyright (c) 2010-2016 by the respective copyright holders. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.openhab.binding.nikobus.internal.core; import static org.junit.Assert.assertEquals; import java.util.ArrayList; import java.util.List; import java.util.concurrent.LinkedBlockingQueue; import org.junit.Test; import org.openhab.binding.nikobus.internal.NikobusBinding; /** * @author Davy Vanherbergen * @since 1.3.0 */ public class NikobusCommandParserTest { @Test public void canSplitCommands() throws InterruptedException { testSplit(new String[] { "AA#N1234", "56\r#N12345", "6\rDD" }, new NikobusCommand[] { new NikobusCommand("AA"), new NikobusCommand("#N123456", 2) }); String[] tmp = new String[60]; for (int i = 0; i < 60; i++) { tmp[i] = "#N123456\r"; } testSplit(new String[] { "#N123456\r" }, new NikobusCommand[] { new NikobusCommand("#N123456", 1) }); // when long presses are received, only full long presses should // be published testSplit(tmp, new NikobusCommand[] { new NikobusCommand("#N123456", 25), new NikobusCommand("#N123456", 37), new NikobusCommand("#N123456", 49) }); testSplit(new String[] { "AA#N123456\r#$5012#N12345", "6\rDD" }, new NikobusCommand[] { new NikobusCommand("AA"), new NikobusCommand("#N123456"), new NikobusCommand("#"), new NikobusCommand("$5012"), new NikobusCommand("#N123456") }); testSplit(new String[] { "AA#N1234", "56\r#N12345", "6\rDD" }, new NikobusCommand[] { new NikobusCommand("AA"), new NikobusCommand("#N123456", 2) }); } private void testSplit(String[] values, NikobusCommand[] commands) throws InterruptedException { NikobusCommandReceiver parser = new NikobusCommandReceiver(null); final List<NikobusCommand> receivedCmds = new ArrayList<NikobusCommand>(); LinkedBlockingQueue<byte[]> queue = new LinkedBlockingQueue<byte[]>(); parser.setBufferQueue(queue); parser.register(new NikobusCommandListener() { @Override public void processNikobusCommand(NikobusCommand command, NikobusBinding binding) { receivedCmds.add(new NikobusCommand(command.getCommand(), command.getRepeats())); } @Override public String getName() { return "dummy"; } }); for (String s : values) { byte[] bb = s.getBytes(); queue.put(bb); } Thread t = new Thread(parser); t.start(); Thread.sleep(1000); t.interrupt(); for (int i = 0; i < commands.length; i++) { NikobusCommand c = receivedCmds.get(i); assertEquals(commands[i].getCommand(), c.getCommand()); assertEquals(commands[i].getRepeats(), c.getRepeats()); } assertEquals(commands.length, receivedCmds.size()); } }