/*
* Copyright 2012-2017 the original author or authors.
*
* Licensed 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 io.spring.initializr.util;
import java.util.Arrays;
import java.util.Collections;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import static org.hamcrest.core.IsNot.not;
import static org.junit.Assert.assertThat;
/**
* @author Stephane Nicoll
*/
public class VersionRangeTests {
@Rule
public final ExpectedException thrown = ExpectedException.none();
@Test
public void matchSimpleRange() {
assertThat("1.2.0.RC3", match("[1.2.0.RC1,1.2.0.RC5]"));
}
@Test
public void matchSimpleRangeBefore() {
assertThat("1.1.9.RC3", not(match("[1.2.0.RC1,1.2.0.RC5]")));
}
@Test
public void matchSimpleRangeAfter() {
assertThat("1.2.0.RC6", not(match("[1.2.0.RC1,1.2.0.RC5]")));
}
@Test
public void matchInclusiveLowerRange() {
assertThat("1.2.0.RC1", match("[1.2.0.RC1,1.2.0.RC5]"));
}
@Test
public void matchInclusiveHigherRange() {
assertThat("1.2.0.RC5", match("[1.2.0.RC1,1.2.0.RC5]"));
}
@Test
public void matchExclusiveLowerRange() {
assertThat("1.2.0.RC1", not(match("(1.2.0.RC1,1.2.0.RC5)")));
}
@Test
public void matchExclusiveHigherRange() {
assertThat("1.2.0.RC5", not(match("[1.2.0.RC1,1.2.0.RC5)")));
}
@Test
public void matchUnboundedRangeEqual() {
assertThat("1.2.0.RELEASE", match("1.2.0.RELEASE"));
}
@Test
public void matchUnboundedRangeAfter() {
assertThat("2.2.0.RELEASE", match("1.2.0.RELEASE"));
}
@Test
public void matchUnboundedRangeBefore() {
assertThat("1.1.9.RELEASE", not(match("1.2.0.RELEASE")));
}
@Test
public void rangeWithSpaces() {
assertThat("1.2.0.RC3", match("[ 1.2.0.RC1 , 1.2.0.RC5]"));
}
@Test
public void matchLatestVersion() {
assertThat("1.2.8.RELEASE", match("[1.2.0.RELEASE,1.2.x.BUILD-SNAPSHOT]",
new VersionParser(Collections.singletonList(
Version.parse("1.2.9.BUILD-SNAPSHOT")))));
}
@Test
public void matchOverLatestVersion() {
assertThat("1.2.10.RELEASE", not(match("[1.2.0.RELEASE,1.2.x.BUILD-SNAPSHOT]",
new VersionParser(Collections.singletonList(
Version.parse("1.2.9.BUILD-SNAPSHOT"))))));
}
@Test
public void matchAsOfCurrentVersion() {
assertThat("1.3.5.RELEASE", match("[1.3.x.RELEASE,1.3.x.BUILD-SNAPSHOT]",
new VersionParser(Arrays.asList(Version.parse("1.3.4.RELEASE"),
Version.parse("1.3.6.BUILD-SNAPSHOT")))));
}
@Test
public void matchOverAsOfCurrentVersion() {
assertThat("1.3.5.RELEASE", not(match("[1.3.x.RELEASE,1.3.x.BUILD-SNAPSHOT]",
new VersionParser(Arrays.asList(Version.parse("1.3.7.RELEASE"),
Version.parse("1.3.6.BUILD-SNAPSHOT"))))));
}
private static VersionRangeMatcher match(String range) {
return new VersionRangeMatcher(range, new VersionParser(Collections.emptyList()));
}
private static VersionRangeMatcher match(String range, VersionParser parser) {
return new VersionRangeMatcher(range, parser);
}
static class VersionRangeMatcher extends BaseMatcher<String> {
private final VersionRange range;
private final VersionParser parser;
VersionRangeMatcher(String text, VersionParser parser) {
this.parser = parser;
this.range = parser.parseRange(text);
}
@Override
public boolean matches(Object item) {
if (!(item instanceof String)) {
return false;
}
return this.range.match(this.parser.parse((String) item));
}
@Override
public void describeTo(Description description) {
description.appendText(range.toString());
}
}
}