diff --git a/src/main/java/net/andreinc/mockneat/MockNeat.java b/src/main/java/net/andreinc/mockneat/MockNeat.java index 174baf3..c51a3ff 100644 --- a/src/main/java/net/andreinc/mockneat/MockNeat.java +++ b/src/main/java/net/andreinc/mockneat/MockNeat.java @@ -244,6 +244,13 @@ public Countries countries() { */ public Currencies currencies() { return this.rCurrencies; } + /** + *

Returns a {@code CSVs} object that can be used to generate CSV lines or files.

+ * + * @return A new CSVs object. + */ + public CSVs csvs() { return new CSVs(this); } + /** *

Returns a {@code CVVS} object that can be used to generate credit card cvv codes.

* @@ -350,8 +357,6 @@ public Filler filler(Supplier supplier) { /** *

Returns a {@code Formatter} object than can be used to generate arbitrary patterns based on a given format.

* - *

Eg.: m.fmt("#{oneInt} + #{aLetter}").params("oneInt", m.ints(), "aLetter", m.chars().letters()).val()

- * * @param fmt The template of the desired pattern. * @return A new {@code Formatter} object. The {@code Formatter} class implements {@code MockUnitString}. */ diff --git a/src/main/java/net/andreinc/mockneat/unit/text/CSVs.java b/src/main/java/net/andreinc/mockneat/unit/text/CSVs.java new file mode 100644 index 0000000..0f09038 --- /dev/null +++ b/src/main/java/net/andreinc/mockneat/unit/text/CSVs.java @@ -0,0 +1,75 @@ +package net.andreinc.mockneat.unit.text; + +import net.andreinc.mockneat.MockNeat; +import net.andreinc.mockneat.abstraction.*; +import org.apache.commons.text.StringEscapeUtils; + +import java.util.LinkedList; +import java.util.List; +import java.util.function.Supplier; + +import static net.andreinc.mockneat.abstraction.MockConstValue.constant; +import static net.andreinc.mockneat.abstraction.MockUnitValue.unit; +import static net.andreinc.mockneat.utils.ValidationUtils.notEmpty; +import static net.andreinc.mockneat.utils.ValidationUtils.notNull; + +public class CSVs extends MockUnitBase implements MockUnitString { + + public CSVs(MockNeat mockNeat) { + super(mockNeat); + } + + private String separator = ","; + private List columns = new LinkedList<>(); + + public void separator(String separator) { + notEmpty(separator, "separator"); + this.separator = separator; + } + + /** + * Add a new column to the resulting csv line. + * Internally the supplied mockUnit is transformed to a MockUnitString and afterwards + * the `escapeCsvMethod()` is called. + * @param mockUnit The supplied mockUnit + */ + public CSVs addColumn(MockUnit mockUnit) { + notNull(mockUnit, "mockUnit"); + columns.add(unit(mockUnit.mapToString().escapeCsv())); + return this; + } + + /** + * Add a new column to resulting CVS line with a constant value. + * The toString() method of the supplied object is invoked. + * @param value The constant value used + */ + public CSVs addColumn(Object value) { + notNull(value, "value"); + columns.add(constant(value)); + return this; + } + + @Override + public Supplier supplier() { + Supplier supplier = () -> { + StringBuilder buff = new StringBuilder(); + columns.stream().forEach((v) -> { + if (v instanceof MockConstValue) { + buff.append(StringEscapeUtils.escapeCsv(v.getStr())); + } + else if (v instanceof MockUnitValue) { + buff.append(v.get()); + } + buff.append(separator); + }); + buff.delete(buff.length() - separator.length(), buff.length()); + return buff.toString(); + }; + return supplier; + } + + public void toFile(String filePath, int numberOfLines) { + + } +} diff --git a/src/test/java/net/andreinc/mockneat/Constants.java b/src/test/java/net/andreinc/mockneat/Constants.java index 0109a7d..1cf6ded 100644 --- a/src/test/java/net/andreinc/mockneat/Constants.java +++ b/src/test/java/net/andreinc/mockneat/Constants.java @@ -31,6 +31,7 @@ public class Constants { public static final int CHARS_CYCLES = 1000; public static final int COMPOSE_CYCLES = 1000; public static final int CVVS_CYCLES= 1000; + public static final int CSVS_CYCLES = 1000; public static final int DEP_CYCLES = 1000; public static final int CITIES_CYCLES= 1000; public static final int COUNTRIES_CYCLES = 1000; diff --git a/src/test/java/net/andreinc/mockneat/unit/text/CSVsTest.java b/src/test/java/net/andreinc/mockneat/unit/text/CSVsTest.java new file mode 100644 index 0000000..791eb14 --- /dev/null +++ b/src/test/java/net/andreinc/mockneat/unit/text/CSVsTest.java @@ -0,0 +1,52 @@ +package net.andreinc.mockneat.unit.text; + +import net.andreinc.mockneat.abstraction.MockUnit; +import net.andreinc.mockneat.abstraction.MockUnitString; +import net.andreinc.mockneat.utils.LoopsUtils; +import org.junit.Assert; +import org.junit.Test; + +import static net.andreinc.mockneat.Constants.CSVS_CYCLES; +import static net.andreinc.mockneat.Constants.M; +import static net.andreinc.mockneat.Constants.MOCKS; + +public class CSVsTest { + + @Test + public void testLine() { + MockUnitString ms1 = M.fromStrings(new String[]{"ABC\","}); + String line = M.csvs() + .addColumn(ms1) + .addColumn("A,a") + .val(); + Assert.assertTrue(line.equals("\"ABC\"\",\",\"A,a\"")); + } + + @Test + public void testLineLoop() { + MockUnit torf = M.bools(); + LoopsUtils.loop( + CSVS_CYCLES, + MOCKS, + m -> { + return m.csvs() + .addColumn("A") + .addColumn(torf) + .addColumn(m.names()) + .val(); + }, + s -> { + String[] split = s.split(","); + Assert.assertTrue(split.length == 3); + Assert.assertTrue(split[0].equals("A")); + Assert.assertTrue(split[1].equals("true") || split[1].equals("false")); + } + + ); + } + + @Test(expected = NullPointerException.class) + public void testLineNullMockUnit() throws Exception { + M.csvs().addColumn(null).val(); + } +}