blob: 03b90e015012d5d363b103c3da2694a62f9337e4 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.felix.gogo.shell;
import java.util.Iterator;
import junit.framework.TestCase;
import org.apache.felix.gogo.shell.History;
import org.junit.Before;
import org.junit.Test;
public class HistoryTest {
private static final String[] COMMANDS = {
"cd home", "ls", "more config", "more xconfig"
};
private History history;
@Before
public void setup() {
this.history = new History();
for (String cmd : COMMANDS) {
this.history.append(cmd);
}
}
@Test
public void test_add_get_history() {
final History his = new History();
his.append("cmd1");
Iterator<String> hi = his.getHistory();
TestCase.assertEquals("cmd1", hi.next());
TestCase.assertFalse(hi.hasNext());
}
@Test
public void test_fill_history() {
final History his = new History();
// NOTE: Assumes a fixed history size of 100
for (int i = 0; i < 100; i++) {
his.append("cmd" + i);
}
Iterator<String> hi = his.getHistory();
for (int i = 0; i < 100; i++) {
TestCase.assertEquals("cmd" + i, hi.next());
}
TestCase.assertFalse(hi.hasNext());
}
@Test
public void test_overflow_history() {
final History his = new History();
// NOTE: Assumes a fixed history size of 100
for (int i = -20; i < 100; i++) {
his.append("cmd" + i);
}
Iterator<String> hi = his.getHistory();
for (int i = 0; i < 100; i++) {
TestCase.assertEquals("cmd" + i, hi.next());
}
TestCase.assertFalse(hi.hasNext());
}
@Test
public void test_get_recent() {
TestCase.assertEquals(COMMANDS[3], history.evaluate("!!"));
TestCase.assertEquals(COMMANDS[3], history.evaluate("!-1"));
TestCase.assertEquals(COMMANDS[2], history.evaluate("!-2"));
TestCase.assertEquals(COMMANDS[1], history.evaluate("!-3"));
TestCase.assertEquals(COMMANDS[0], history.evaluate("!-4"));
TestCase.assertEquals(COMMANDS[0], history.evaluate("!1"));
TestCase.assertEquals(COMMANDS[1], history.evaluate("!2"));
TestCase.assertEquals(COMMANDS[2], history.evaluate("!3"));
TestCase.assertEquals(COMMANDS[3], history.evaluate("!4"));
}
@Test
public void test_get_recent_wrong_index() {
try {
history.evaluate("!0");
TestCase.fail("Expected IllegalArgumentException");
} catch (IllegalArgumentException iae) {
// expected
}
try {
history.evaluate("!5");
TestCase.fail("Expected IllegalArgumentException");
} catch (IllegalArgumentException iae) {
// expected
}
try {
history.evaluate("!-5");
TestCase.fail("Expected IllegalArgumentException");
} catch (IllegalArgumentException iae) {
// expected
}
}
@Test
public void test_caret() {
TestCase.assertEquals("ls xconfig", history.evaluate("^more^ls^"));
TestCase.assertEquals("ls xconfig", history.evaluate("^more^ls"));
TestCase.assertEquals("ls -l xconfig", history.evaluate("^more^ls -l"));
}
@Test
public void test_caret_fail() {
try {
history.evaluate("^ls^cat^");
TestCase.fail("Expected failure for impossible replacement");
} catch (IllegalArgumentException iae) {
// expected
}
}
@Test
public void test_s_last() {
TestCase.assertEquals("ls xconfig", history.evaluate("!!:s?more?ls?"));
TestCase.assertEquals("ls xconfig", history.evaluate("!!:s/more/ls"));
TestCase.assertEquals("ls -l xconfig", history.evaluate("!!:s^more^ls -l"));
TestCase.assertEquals("mare xconfig", history.evaluate("!!:s?o?a?"));
}
@Test
public void test_s_last_fail() {
try {
history.evaluate("!!:s/ls/cat/");
TestCase.fail("Expected failure for impossible replacement");
} catch (IllegalArgumentException iae) {
// expected
}
}
@Test
public void test_s_g_a_last() {
TestCase.assertEquals("mire xcinfig", history.evaluate("!!:gs?o?i?"));
TestCase.assertEquals("mire xcinfig", history.evaluate("!!:gs/o/i"));
TestCase.assertEquals("mi-xre xci-xnfig", history.evaluate("!!:gs^o^i-x"));
TestCase.assertEquals("mire xcinfig", history.evaluate("!!:as?o?i?"));
TestCase.assertEquals("mire xcinfig", history.evaluate("!!:as/o/i"));
TestCase.assertEquals("mi-xre xci-xnfig", history.evaluate("!!:as^o^i-x"));
}
@Test
public void test_s_neg_2() {
TestCase.assertEquals("ls config", history.evaluate("!-2:s?more?ls?"));
TestCase.assertEquals("ls config", history.evaluate("!-2:s/more/ls"));
TestCase.assertEquals("ls -l config", history.evaluate("!-2:s^more^ls -l"));
TestCase.assertEquals("mare config", history.evaluate("!-2:s?o?a?"));
}
@Test
public void test_s_neg_2_fail() {
try {
history.evaluate("!-2:s/ls/cat/");
TestCase.fail("Expected failure for impossible replacement");
} catch (IllegalArgumentException iae) {
// expected
}
}
@Test
public void test_s_3() {
TestCase.assertEquals("ls config", history.evaluate("!-2:s?more?ls?"));
TestCase.assertEquals("ls config", history.evaluate("!-2:s/more/ls"));
TestCase.assertEquals("ls -l config", history.evaluate("!-2:s^more^ls -l"));
TestCase.assertEquals("mare config", history.evaluate("!-2:s?o?a?"));
}
@Test
public void test_s_3_fail() {
try {
history.evaluate("!-2:s/ls/cat/");
TestCase.fail("Expected failure for impossible replacement");
} catch (IllegalArgumentException iae) {
// expected
}
}
@Test
public void test_contains() {
TestCase.assertEquals("ls", history.evaluate("!?s"));
TestCase.assertEquals("ls", history.evaluate("!?s?"));
try {
history.evaluate("!?s:s/l/x/");
TestCase.fail("IllegalArgumentException expected");
} catch (IllegalArgumentException iae) {
// expected
}
TestCase.assertEquals("xs", history.evaluate("!?s?:s/l/x/"));
}
@Test
public void test_startsWith() {
TestCase.assertEquals("cd home", history.evaluate("!cd"));
TestCase.assertEquals("cd home", history.evaluate("!cd "));
try {
history.evaluate("!cd:s/x/y/");
TestCase.fail("IllegalArgumentException expected");
} catch (IllegalArgumentException iae) {
// expected
}
TestCase.assertEquals("ls home", history.evaluate("!cd:s/cd/ls/"));
}
}