Skip to content

Commit

Permalink
Merge 5a61305 into 0f53114
Browse files Browse the repository at this point in the history
  • Loading branch information
amihaiemil committed Mar 14, 2020
2 parents 0f53114 + 5a61305 commit 7d32339
Show file tree
Hide file tree
Showing 9 changed files with 529 additions and 28 deletions.
95 changes: 95 additions & 0 deletions src/main/java/com/amihaiemil/eoyaml/NoDirectivesOrMarkers.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
/**
* Copyright (c) 2016-2020, Mihai Emil Andronache
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
package com.amihaiemil.eoyaml;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

/**
* No directives or markers. Decorates some YamlLines
* and ignores YAML directives and markers from iteration.
* @author Mihai Andronache (amihaiemil@gmail.com)
* @version $Id$
* @since 3.1.2
*/
final class NoDirectivesOrMarkers implements YamlLines {

/**
* YamlLines.
*/
private final YamlLines yamlLines;

/**
* Ctor.
* @param yamlLines The Yaml lines.
*/
NoDirectivesOrMarkers(final YamlLines yamlLines) {
this.yamlLines = yamlLines;
}

/**
* Returns an iterator over these Yaml lines.
* It ignores the YAML Directives and Marker lines.
* @return Iterator over these yaml lines.
*/
@Override
public Iterator<YamlLine> iterator() {
Iterator<YamlLine> iterator = this.yamlLines.iterator();
if (iterator.hasNext()) {
final List<YamlLine> noDirsOrMarks = new ArrayList<>();
while (iterator.hasNext()) {
final YamlLine current = iterator.next();
final String currentLine = current.trimmed();
if (
"---".equals(currentLine)
|| "...".equals(currentLine)
|| currentLine.startsWith("%")
|| currentLine.startsWith("!!")
) {
continue;
} else {
noDirsOrMarks.add(current);
}
}
iterator = noDirsOrMarks.iterator();
}
return iterator;
}

@Override
public Collection<YamlLine> lines() {
return this.yamlLines.lines();
}

@Override
public YamlNode toYamlNode(final YamlLine prev) {
return this.yamlLines.toYamlNode(prev);
}
}
10 changes: 8 additions & 2 deletions src/main/java/com/amihaiemil/eoyaml/ReadYamlMapping.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,9 @@
import java.util.*;

/**
* YamlMapping read from somewhere.
* YamlMapping read from somewhere. YAML directives and
* document start/end markers are ignored. This is assumed
* to be a plain YAML mapping.
* @author Mihai Andronache (amihaiemil@gmail.com)
* @version $Id$
* @since 1.0.0
Expand All @@ -48,7 +50,11 @@ final class ReadYamlMapping extends ComparableYamlMapping {
*/
ReadYamlMapping(final AllYamlLines lines) {
this.lines = new SameIndentationLevel(
new WellIndented(lines)
new WellIndented(
new NoDirectivesOrMarkers(
lines
)
)
);
}

Expand Down
6 changes: 5 additions & 1 deletion src/main/java/com/amihaiemil/eoyaml/ReadYamlSequence.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,11 @@ final class ReadYamlSequence extends ComparableYamlSequence {
*/
ReadYamlSequence(final AllYamlLines lines) {
this.lines = new SameIndentationLevel(
new WellIndented(lines)
new WellIndented(
new NoDirectivesOrMarkers(
lines
)
)
);
}

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/amihaiemil/eoyaml/RtYamlLine.java
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ public int compareTo(final YamlLine other) {
public boolean hasNestedNode() {
final boolean result;
final String specialCharacters = ":>|-?";

final CharSequence prevLineLastChar =
this.trimmed().substring(this.trimmed().length()-1);
if(specialCharacters.contains(prevLineLastChar)) {
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/amihaiemil/eoyaml/WellIndented.java
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
*
* YamlLines wellIndented = new SameIndentationLevel(
* new WellIndented(
* new NoMarkersOrDirectives(
* new NoDirectivesOrMarkers(
* lines
* )//ignore markers or directives
* )
Expand Down
178 changes: 178 additions & 0 deletions src/test/java/com/amihaiemil/eoyaml/NoDirectivesOrMarkersTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
/**
* Copyright (c) 2016-2020, Mihai Emil Andronache
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
package com.amihaiemil.eoyaml;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import org.hamcrest.MatcherAssert;
import org.hamcrest.Matchers;
import org.junit.Test;
import org.mockito.Mockito;

/**
* Unit tests for {@link NoDirectivesOrMarkers}.
* @author Mihai Andronache (amihaiemil@gmail.com)
* @version $Id$
* @since 3.1.2
*/
public final class NoDirectivesOrMarkersTest {

/**
* NoDirectivesOrMarkers can return the encapsulated lines.
*/
@Test
@SuppressWarnings("unchecked")
public void returnsLines() {
final YamlLines lines = Mockito.mock(YamlLines.class);
final Collection<YamlLine> collection = Mockito.mock(Collection.class);
Mockito.when(lines.lines()).thenReturn(collection);
MatcherAssert.assertThat(
new NoDirectivesOrMarkers(lines).lines(),
Matchers.is(collection)
);
}

/**
* NoDirectivesOrMarkers can turn itself into YamlNode.
*/
@Test
public void turnsIntoYamlNode() {
final YamlLines lines = Mockito.mock(YamlLines.class);
final YamlLine prev = Mockito.mock(YamlLine.class);
final YamlNode result = Mockito.mock(YamlNode.class);
Mockito.when(lines.toYamlNode(prev)).thenReturn(result);
MatcherAssert.assertThat(
new NoDirectivesOrMarkers(lines).toYamlNode(prev),
Matchers.is(result)
);
}

/**
* NoDirectivesOrMarkers should ignore YAML directives
* and markers from iteration.
*/
@Test
public void ignoresDirectivesAndMarkers() {
final List<YamlLine> lines = new ArrayList<>();
lines.add(new RtYamlLine("%YAML 1.2", 0));
lines.add(new RtYamlLine("---", 1));
lines.add(new RtYamlLine("first: something", 2));
lines.add(new RtYamlLine("second: ", 3));
lines.add(new RtYamlLine(" fourth: some", 4));
lines.add(new RtYamlLine(" fifth: values", 5));
lines.add(new RtYamlLine("third:", 6));
lines.add(new RtYamlLine(" - seq", 7));
lines.add(new RtYamlLine("...", 8));
final YamlLines ndmLines = new NoDirectivesOrMarkers(
new AllYamlLines(lines)
);
MatcherAssert.assertThat(
ndmLines,
Matchers.iterableWithSize(6)
);
final Iterator<YamlLine> iterator = ndmLines.iterator();
MatcherAssert.assertThat(
iterator.next().trimmed(),
Matchers.equalTo("first: something")
);
MatcherAssert.assertThat(
iterator.next().trimmed(),
Matchers.equalTo("second:")
);
MatcherAssert.assertThat(
iterator.next().trimmed(),
Matchers.equalTo("fourth: some")
);
MatcherAssert.assertThat(
iterator.next().trimmed(),
Matchers.equalTo("fifth: values")
);
MatcherAssert.assertThat(
iterator.next().trimmed(),
Matchers.equalTo("third:")
);
MatcherAssert.assertThat(
iterator.next().trimmed(),
Matchers.equalTo("- seq")
);
}

/**
* NoDirectivesOrMarkers iterates over all the lines, since
* there are actually no directives or markers to ignore.
*/
@Test
public void noDirectivesAndMarkersToIgnore() {
final List<YamlLine> lines = new ArrayList<>();
lines.add(new RtYamlLine("first: something", 0));
lines.add(new RtYamlLine("second: ", 1));
lines.add(new RtYamlLine(" fourth: some", 2));
lines.add(new RtYamlLine(" fifth: values", 3));
final YamlLines ndmLines = new NoDirectivesOrMarkers(
new AllYamlLines(lines)
);
MatcherAssert.assertThat(
ndmLines,
Matchers.iterableWithSize(4)
);
final Iterator<YamlLine> iterator = ndmLines.iterator();
MatcherAssert.assertThat(
iterator.next().trimmed(),
Matchers.equalTo("first: something")
);
MatcherAssert.assertThat(
iterator.next().trimmed(),
Matchers.equalTo("second:")
);
MatcherAssert.assertThat(
iterator.next().trimmed(),
Matchers.equalTo("fourth: some")
);
MatcherAssert.assertThat(
iterator.next().trimmed(),
Matchers.equalTo("fifth: values")
);
}

/**
* NoDirectivesOrMarkers works with no lines.
*/
@Test
public void iteratesEmptyLines() {
final YamlLines ndmLines = new NoDirectivesOrMarkers(
new AllYamlLines(new ArrayList<YamlLine>())
);
MatcherAssert.assertThat(
ndmLines,
Matchers.iterableWithSize(0)
);
}
}

0 comments on commit 7d32339

Please sign in to comment.