blob: 59fc69da751ba9814d663803b27757a7fa8716a5 [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.jsieve.utils;
import static org.assertj.core.api.Assertions.assertThat;
import com.google.common.collect.Lists;
import org.apache.jsieve.Argument;
import org.apache.jsieve.NumberArgument;
import org.apache.jsieve.StringListArgument;
import org.apache.jsieve.TagArgument;
import org.apache.jsieve.exception.SyntaxException;
import org.apache.jsieve.parser.generated.Token;
import org.junit.Test;
public class ArgumentParserTest {
public static final int KIND = 18;
public static final int NUMERIC_VALUE = 42;
public static final String ANY_TAG = ":any";
public static final String OTHER_TAG = ":other";
public static final String EXCEPTION_MESSAGE = "ExceptionMessage";
public static final String STRING_VALUE = "string";
public static final String STRING_VALUE_2 = "string2";
public static final TagArgument ANY_TAG_ARGUMENT = new TagArgument(new Token(KIND, ANY_TAG));
public static final TagArgument OTHER_TAG_ARGUMENT = new TagArgument(new Token(KIND, OTHER_TAG));
public static final NumberArgument NUMBER_ARGUMENT = new NumberArgument(new Token(KIND, Integer.toString(NUMERIC_VALUE)));
public static final StringListArgument SINGLE_STRING_ARGUMENT = new StringListArgument(Lists.newArrayList(STRING_VALUE));
public static final StringListArgument STRING_LIST_ARGUMENT = new StringListArgument(Lists.newArrayList(STRING_VALUE, STRING_VALUE_2));
@Test
public void getRemainingStringValueShouldReturnNullByDefault() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.<Argument>newArrayList());
assertThat(argumentParser.getRemainingStringValue(EXCEPTION_MESSAGE)).isNull();
}
@Test
public void getNumericValueForTagShouldReturnNullByDefault() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.<Argument>newArrayList());
assertThat(argumentParser.getNumericValueForTag(ANY_TAG, EXCEPTION_MESSAGE)).isNull();
}
@Test
public void getStringListForTagShouldReturnEmptyByDefault() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.<Argument>newArrayList());
assertThat(argumentParser.getStringListForTag(ANY_TAG, EXCEPTION_MESSAGE)).isEmpty();
}
@Test
public void getStringValueForTagShouldReturnNullByDefault() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.<Argument>newArrayList());
assertThat(argumentParser.getStringValueForTag(ANY_TAG, EXCEPTION_MESSAGE)).isNull();
}
@Test
public void validateSingleTagsShouldNotThrowByDefault() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.<Argument>newArrayList());
argumentParser.throwOnUnvalidSeenSingleTag();
}
@Test
public void validateTagsWithValueShouldNotThrowByDefault() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.<Argument>newArrayList());
argumentParser.throwOnUnvalidSeenTagWithValue();
}
@Test
public void validateSingleTagsShouldNotThrowWhenAllowedValuesAreNotPresent() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.<Argument>newArrayList());
argumentParser.throwOnUnvalidSeenSingleTag(ANY_TAG);
}
@Test
public void validateTagsWithValueShouldNotThrowWhenAllowedValuesAreNotPresent() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.<Argument>newArrayList());
argumentParser.throwOnUnvalidSeenTagWithValue(ANY_TAG);
}
@Test(expected = SyntaxException.class)
public void validateSingleTagsShouldThrowOnUnexpectedSingleTag() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.<Argument>newArrayList(ANY_TAG_ARGUMENT));
argumentParser.throwOnUnvalidSeenSingleTag();
}
@Test
public void validateTagsWithValueShouldNotThrowOnSingleTag() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.<Argument>newArrayList(ANY_TAG_ARGUMENT));
argumentParser.throwOnUnvalidSeenTagWithValue();
}
@Test
public void validateSingleTagsShouldNotThrowOnExpectedSingleTag() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.<Argument>newArrayList(ANY_TAG_ARGUMENT));
argumentParser.throwOnUnvalidSeenSingleTag(ANY_TAG);
}
@Test
public void validateSingleTagsShouldNotThrowOnTagWithValue() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.newArrayList(OTHER_TAG_ARGUMENT, NUMBER_ARGUMENT));
argumentParser.throwOnUnvalidSeenSingleTag(ANY_TAG);
}
@Test(expected = SyntaxException.class)
public void validateTagsWithValueShouldThrowOnUnexpectedTagWithValue() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.newArrayList(OTHER_TAG_ARGUMENT, NUMBER_ARGUMENT));
argumentParser.throwOnUnvalidSeenTagWithValue(ANY_TAG);
}
@Test(expected = SyntaxException.class)
public void validateSingleTagsShouldThrowOnUnexpectedValue() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.<Argument>newArrayList(OTHER_TAG_ARGUMENT));
argumentParser.throwOnUnvalidSeenSingleTag(ANY_TAG);
}
@Test(expected = SyntaxException.class)
public void getRemainingStringValueShouldThrowOnWrongArgumentType() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.<Argument>newArrayList(NUMBER_ARGUMENT));
argumentParser.getRemainingStringValue(EXCEPTION_MESSAGE);
}
@Test(expected = SyntaxException.class)
public void getRemainingStringValueShouldThrowOnMultipleElementsInStringList() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.<Argument>newArrayList(STRING_LIST_ARGUMENT));
argumentParser.getRemainingStringValue(EXCEPTION_MESSAGE);
}
@Test
public void getRemainingStringValueShouldWork() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.<Argument>newArrayList(SINGLE_STRING_ARGUMENT));
assertThat(argumentParser.getRemainingStringValue(EXCEPTION_MESSAGE)).isEqualTo(STRING_VALUE);
}
@Test
public void getRemainingStringValueShouldReturnNullWhenCalledWithOnlyTagWithValue() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.newArrayList(ANY_TAG_ARGUMENT, STRING_LIST_ARGUMENT));
assertThat(argumentParser.getRemainingStringValue(EXCEPTION_MESSAGE)).isNull();
}
@Test(expected = SyntaxException.class)
public void getNumericValueForTagShouldThrowOnSingleStringArgument() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.newArrayList(ANY_TAG_ARGUMENT, SINGLE_STRING_ARGUMENT));
argumentParser.getNumericValueForTag(ANY_TAG, EXCEPTION_MESSAGE);
}
@Test
public void getStringListForTagShouldWorkWithSingleValue() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.newArrayList(ANY_TAG_ARGUMENT, SINGLE_STRING_ARGUMENT));
assertThat(argumentParser.getStringListForTag(ANY_TAG, EXCEPTION_MESSAGE)).containsExactly(STRING_VALUE);
}
@Test
public void getStringValueForTagShouldWork() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.newArrayList(ANY_TAG_ARGUMENT, SINGLE_STRING_ARGUMENT));
assertThat(argumentParser.getStringValueForTag(ANY_TAG, EXCEPTION_MESSAGE)).isEqualTo(STRING_VALUE);
}
@Test
public void getNumericValueForTagShouldWork() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.newArrayList(ANY_TAG_ARGUMENT, NUMBER_ARGUMENT));
assertThat(argumentParser.getNumericValueForTag(ANY_TAG, EXCEPTION_MESSAGE)).isEqualTo(NUMERIC_VALUE);
}
@Test(expected = SyntaxException.class)
public void getStringListForTagShouldThrowWhenUsedWithNumberArgument() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.newArrayList(ANY_TAG_ARGUMENT, NUMBER_ARGUMENT));
argumentParser.getStringListForTag(ANY_TAG, EXCEPTION_MESSAGE);
}
@Test(expected = SyntaxException.class)
public void getStringValueForTagShouldThrowWhenUsedWithNumberArgument() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.newArrayList(ANY_TAG_ARGUMENT, NUMBER_ARGUMENT));
argumentParser.getStringValueForTag(ANY_TAG, EXCEPTION_MESSAGE);
}
@Test(expected = SyntaxException.class)
public void getNumericValueForTagShouldThrowWhenUsedWithStringListArgument() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.newArrayList(ANY_TAG_ARGUMENT, STRING_LIST_ARGUMENT));
argumentParser.getNumericValueForTag(ANY_TAG, EXCEPTION_MESSAGE);
}
@Test
public void getStringListForTagShouldWork() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.newArrayList(ANY_TAG_ARGUMENT, STRING_LIST_ARGUMENT));
assertThat(argumentParser.getStringListForTag(ANY_TAG, EXCEPTION_MESSAGE)).containsOnly(STRING_VALUE, STRING_VALUE_2);
}
@Test(expected = SyntaxException.class)
public void getStringValueForTagShouldThrowWhenUsedWithMultipleValues() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.newArrayList(ANY_TAG_ARGUMENT, STRING_LIST_ARGUMENT));
argumentParser.getStringValueForTag(ANY_TAG, EXCEPTION_MESSAGE);
}
@Test
public void getNumericValueForTagShouldReturnNullWhenUsedOnAnOtherTag() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.newArrayList(OTHER_TAG_ARGUMENT, NUMBER_ARGUMENT));
assertThat(argumentParser.getNumericValueForTag(ANY_TAG, EXCEPTION_MESSAGE)).isNull();
}
@Test
public void getStringListForTagShouldReturnNullWhenUsedOnAnOtherTag() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.newArrayList(OTHER_TAG_ARGUMENT, STRING_LIST_ARGUMENT));
assertThat(argumentParser.getStringListForTag(ANY_TAG, EXCEPTION_MESSAGE)).isEmpty();
}
@Test
public void getStringValueForTagShouldReturnNullWhenUsedOnAnOtherTag() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.newArrayList(OTHER_TAG_ARGUMENT, SINGLE_STRING_ARGUMENT));
assertThat(argumentParser.getStringValueForTag(ANY_TAG, EXCEPTION_MESSAGE)).isNull();
}
@Test
public void argumentParserShouldHandleMultipleTagsWithValue() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.newArrayList(OTHER_TAG_ARGUMENT, SINGLE_STRING_ARGUMENT, ANY_TAG_ARGUMENT, NUMBER_ARGUMENT));
assertThat(argumentParser.getNumericValueForTag(ANY_TAG, EXCEPTION_MESSAGE)).isEqualTo(NUMERIC_VALUE);
assertThat(argumentParser.getStringValueForTag(OTHER_TAG, EXCEPTION_MESSAGE));
}
@Test
public void argumentParserShouldHandleTagWithValueAndRemainingString() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.newArrayList(ANY_TAG_ARGUMENT, NUMBER_ARGUMENT, SINGLE_STRING_ARGUMENT));
assertThat(argumentParser.getNumericValueForTag(ANY_TAG, EXCEPTION_MESSAGE)).isEqualTo(NUMERIC_VALUE);
assertThat(argumentParser.getRemainingStringValue(EXCEPTION_MESSAGE)).isEqualTo(STRING_VALUE);
}
@Test
public void argumentParserShouldHandleMultipleSingleTagArguments() throws Exception {
ArgumentParser argumentParser = new ArgumentParser(Lists.<Argument>newArrayList(ANY_TAG_ARGUMENT, OTHER_TAG_ARGUMENT));
assertThat(argumentParser.getSingleTags()).containsExactly(ANY_TAG, OTHER_TAG);
}
}