package com.willwinder.universalgcodesender.pendantui;
import com.google.gson.Gson;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import org.junit.Before;
import org.junit.Test;
import com.willwinder.universalgcodesender.AbstractController;
import com.willwinder.universalgcodesender.IController;
import com.willwinder.universalgcodesender.model.BackendAPI;
import com.willwinder.universalgcodesender.model.UGSEvent.ControlState;
import com.willwinder.universalgcodesender.model.UnitUtils;
import com.willwinder.universalgcodesender.pendantui.PendantConfigBean.StepSizeOption;
import com.willwinder.universalgcodesender.utils.Settings;
import org.easymock.EasyMock;
public class PendantUITest {
private final BackendAPI mockBackend = EasyMock.createStrictMock(BackendAPI.class);
private final IController mockController = EasyMock.createStrictMock(AbstractController.class);
private final SystemStateBean systemState = new SystemStateBean();
private final PendantUI pendantUI = new PendantUI(mockBackend);
@Before
public void setup(){
EasyMock.reset(mockBackend, mockController);
pendantUI.setSystemState(systemState);
}
@Test
public void testPendantUI() {
assertSame(mockBackend, pendantUI.getMainWindow());
}
@Test
public void testStart() throws Exception {
// This is what we're about to do...
// 1. Send a command
mockBackend.sendGcodeCommand("MyGcode");
EasyMock.expect(EasyMock.expectLastCall()).once();
// 2. Commands
mockBackend.performHomingCycle();
EasyMock.expect(EasyMock.expectLastCall()).once();
mockBackend.killAlarmLock();
EasyMock.expect(EasyMock.expectLastCall()).once();
mockBackend.toggleCheckMode();
EasyMock.expect(EasyMock.expectLastCall()).once();
mockBackend.send();
EasyMock.expect(EasyMock.expectLastCall()).once();
// 3. Call some invalid commands which wont reach the backend.
// 4. Change the mode to sending and call pause/resume and cancel.
mockBackend.pauseResume();
EasyMock.expect(EasyMock.expectLastCall()).once();
mockBackend.cancel();
EasyMock.expect(EasyMock.expectLastCall()).once();
// 5. Adjust machine location.
mockBackend.adjustManualLocation(1, 2, 3, 4.0, 1.0, UnitUtils.Units.UNKNOWN);
EasyMock.expect(EasyMock.expectLastCall()).once();
// 6. Get system state
mockBackend.updateSystemState(EasyMock.anyObject(SystemStateBean.class));
EasyMock.expect(EasyMock.expectLastCall()).times(2);
// 7. Get settings
Settings settings = new Settings();
settings.getPendantConfig().getStepSizeList().add(new StepSizeOption("newStepSizeOptionValue", "newStepSizeOptionLabel", false));
EasyMock.expect(mockBackend.getSettings()).andReturn(settings).once();
///////////////////////////
// Start mock and do it! //
///////////////////////////
EasyMock.replay(mockBackend);
pendantUI.setPort(23123);
String url = pendantUI.start().get(0).getUrlString();
systemState.setControlState(ControlState.COMM_IDLE);
pendantUI.setSystemState(systemState);
// test resource handler
String indexPage = getResponse(url);
assertTrue(indexPage.contains("$(function()"));
// 1. Send a command
getResponse(url+"/sendGcode?gCode=MyGcode");
// 2. Send commands
getResponse(url+"/sendGcode?gCode=$H");
getResponse(url+"/sendGcode?gCode=$X");
getResponse(url+"/sendGcode?gCode=$C");
getResponse(url+"/sendGcode?gCode=SEND_FILE");
// 3. Call some invalid commands which wont reach the backend.
getResponse(url+"/sendGcode?gCode=PAUSE_RESUME_FILE");
getResponse(url+"/sendGcode?gCode=CANCEL_FILE");
// 4. Change the mode to sending and call pause/resume and cancel.
systemState.setControlState(ControlState.COMM_SENDING);
getResponse(url+"/sendGcode?gCode=PAUSE_RESUME_FILE");
getResponse(url+"/sendGcode?gCode=CANCEL_FILE");
// 5. Adjust machine location.
systemState.setControlState(ControlState.COMM_IDLE);
String adjustManualLocationResponse =
getResponse(url+"/adjustManualLocation?dirX=1&dirY=2&dirZ=3&stepSize=4.0");
// 6. Get system state
SystemStateBean systemStateTest = new Gson().fromJson(
getResponse(url+"/getSystemState"), SystemStateBean.class);
assertEquals(ControlState.COMM_IDLE, systemStateTest.getControlState());
systemState.setControlState(ControlState.COMM_SENDING);
systemStateTest = new Gson().fromJson(
getResponse(url+"/getSystemState"), SystemStateBean.class);
assertEquals(ControlState.COMM_SENDING, systemStateTest.getControlState());
// 7. Get settings
String configResponse = getResponse(url+"/config");
assertTrue(configResponse.contains("shortCutButtonList"));
assertTrue(configResponse.contains("newStepSizeOptionValue"));
// Wrap up.
pendantUI.stop();
assertTrue(pendantUI.getServer().isStopped());
// Verify that all the EasyMock functions were called.
EasyMock.verify(mockBackend);
}
private String getResponse(String urlStr){
StringBuilder out = new StringBuilder();
try {
URL url = new URL(urlStr);
URLConnection conn = url.openConnection();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
String line;
while ((line = reader.readLine()) != null) {
out.append(line);
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return out.toString();
}
@Test
public void testGetUrl() {
String test = pendantUI.getUrlList().get(0).getUrlString();
assertTrue(test.startsWith("http://"));
assertTrue(test.contains("8080"));
}
@Test
public void testGetPort() {
pendantUI.setPort(999);
assertEquals(999, pendantUI.getPort());
}
@Test
public void testSetPort() {
pendantUI.setPort(999);
assertEquals(999, pendantUI.getPort());
}
@Test
public void testIsManualControlEnabled() {
systemState.setControlState(ControlState.COMM_DISCONNECTED);
assertFalse(pendantUI.isManualControlEnabled());
systemState.setControlState(ControlState.COMM_IDLE);
assertTrue(pendantUI.isManualControlEnabled());
systemState.setControlState(ControlState.COMM_SENDING);
assertFalse(pendantUI.isManualControlEnabled());
systemState.setControlState(ControlState.COMM_SENDING_PAUSED);
assertTrue(pendantUI.isManualControlEnabled());
//systemState.setControlState(ControlState.FILE_SELECTED);
//assertTrue(pendantUI.isManualControlEnabled());
}
@Test
public void testSystemStateSetFileName(){
String fileSeparator = System.getProperty("file.separator");
String testFileName = fileSeparator+"folder1"+fileSeparator+"folder2"+fileSeparator+"fileName.nc";
systemState.setFileName(testFileName);
assertEquals("fileName.nc", systemState.getFileName());
}
}