102030405060708090100110120130140150160170180190200210220231412402514126027141281412903014131232320331093418351836037038039040041042784304432451546047154874905005115520531554055155685705805906086106276306406506676706806915701571072157307407507607707807908014181082083084085126860871268808912690126910921269345394095699631973198099010001010102010301043721050106571072810828109011001110112011301140115011612611701180119012001211241220123124124012512412612412701281241290130124131124132124133013401351241361241371241380139014001410142014301441241451241460147124148314901500151124152601530154015512415615515701586515920160016101620163016401652016601670168016901700171017297173017459175191760177017801790180018101820183124184018501860187018849189019049191281920193019401952819601970198211990200020102020203212040205020649207492080209021002110212762130214312150216021702180219282200221282221422302240225022614227022814229023002310232023314234023502362823728238023902400241024270243024428245024602470248492490250492512225202530254492550256492570258025902600261772620263312640265026602672826802692827015271027202732827402752827602770278027902807128102822828302840285028615628702880289156290029115629213129302940295029615629702980299030039130103020 module fluentasserts.core.operations.contain; import std.algorithm; import std.array; import std.conv; import fluentasserts.core.array; import fluentasserts.core.results; import fluentasserts.core.evaluation; import fluentasserts.core.serializers; import fluentasserts.core.lifecycle; version(unittest) { import fluentasserts.core.expect; } static immutable containDescription = "When the tested value is a string, it asserts that the given string val is a substring of the target. \n\n" ~ "When the tested value is an array, it asserts that the given val is inside the tested value."; /// IResult[] contain(ref Evaluation evaluation) @safe nothrow { evaluation.message.addText("."); IResult[] results = []; auto expectedPieces = evaluation.expectedValue.strValue.parseList.cleanString; auto testData = evaluation.currentValue.strValue.cleanString; if(!evaluation.isNegated) { auto missingValues = expectedPieces.filter!(a => !testData.canFind(a)).array; if(missingValues.length > 0) { addLifecycleMessage(evaluation, missingValues); try results ~= new ExpectedActualResult(createResultMessage(evaluation.expectedValue, expectedPieces), testData); catch(Exception e) { results ~= e.toResults; return results; } } } else { auto presentValues = expectedPieces.filter!(a => testData.canFind(a)).array; if(presentValues.length > 0) { string message = "to not contain "; if(presentValues.length > 1) { message ~= "any "; } message ~= evaluation.expectedValue.strValue; evaluation.message.addText(" "); if(presentValues.length == 1) { try evaluation.message.addValue(presentValues[0]); catch(Exception e) { evaluation.message.addText(" some value "); } evaluation.message.addText(" is present in "); } else { try evaluation.message.addValue(presentValues.to!string); catch(Exception e) { evaluation.message.addText(" some values "); } evaluation.message.addText(" are present in "); } evaluation.message.addValue(evaluation.currentValue.strValue); evaluation.message.addText("."); try results ~= new ExpectedActualResult(message, testData); catch(Exception e) { results ~= e.toResults; return results; } } } return results; } /// IResult[] arrayContain(ref Evaluation evaluation) @trusted nothrow { evaluation.message.addText("."); IResult[] results = []; auto expectedPieces = evaluation.expectedValue.proxyValue.toArray; auto testData = evaluation.currentValue.proxyValue.toArray; if(!evaluation.isNegated) { auto missingValues = expectedPieces.filter!(a => testData.filter!(b => b.isEqualTo(a)).empty).array; if(missingValues.length > 0) { addLifecycleMessage(evaluation, missingValues); try results ~= new ExpectedActualResult(createResultMessage(evaluation.expectedValue, expectedPieces), evaluation.currentValue.strValue); catch(Exception e) { results ~= e.toResults; return results; } } } else { auto presentValues = expectedPieces.filter!(a => !testData.filter!(b => b.isEqualTo(a)).empty).array; if(presentValues.length > 0) { addNegatedLifecycleMessage(evaluation, presentValues); try results ~= new ExpectedActualResult(createNegatedResultMessage(evaluation.expectedValue, expectedPieces), evaluation.currentValue.strValue); catch(Exception e) { results ~= e.toResults; return results; } } } return results; } /// IResult[] arrayContainOnly(ref Evaluation evaluation) @safe nothrow { evaluation.message.addText("."); IResult[] results = []; auto expectedPieces = evaluation.expectedValue.proxyValue.toArray; auto testData = evaluation.currentValue.proxyValue.toArray; auto comparison = ListComparison!EquableValue(testData, expectedPieces); EquableValue[] missing; EquableValue[] extra; EquableValue[] common; try { missing = comparison.missing; extra = comparison.extra; common = comparison.common; } catch(Exception e) { results ~= e.toResults; return results; } string strExtra = ""; string strMissing = ""; if(extra.length > 0) { strExtra = extra.niceJoin(evaluation.currentValue.typeName); } if(missing.length > 0) { strMissing = missing.niceJoin(evaluation.currentValue.typeName); } if(!evaluation.isNegated) { auto isSuccess = missing.length == 0 && extra.length == 0 && common.length == testData.length; if(!isSuccess) { try results ~= new ExpectedActualResult("", testData.niceJoin(evaluation.currentValue.typeName)); catch(Exception e) { results ~= e.toResults; return results; } try results ~= new ExtraMissingResult(strExtra, strMissing); catch(Exception e) { results ~= e.toResults; return results; } } } else { auto isSuccess = (missing.length != 0 || extra.length != 0) || common.length != testData.length; if(!isSuccess) { try results ~= new ExpectedActualResult("to not contain " ~ expectedPieces.niceJoin(evaluation.currentValue.typeName), testData.niceJoin(evaluation.currentValue.typeName)); catch(Exception e) { results ~= e.toResults; return results; } } } return results; } /// void addLifecycleMessage(ref Evaluation evaluation, string[] missingValues) @safe nothrow { evaluation.message.addText(" "); if(missingValues.length == 1) { try evaluation.message.addValue(missingValues[0]); catch(Exception) { evaluation.message.addText(" some value "); } evaluation.message.addText(" is missing from "); } else { try { evaluation.message.addValue(missingValues.niceJoin(evaluation.currentValue.typeName)); } catch(Exception) { evaluation.message.addText(" some values "); } evaluation.message.addText(" are missing from "); } evaluation.message.addValue(evaluation.currentValue.strValue); evaluation.message.addText("."); } /// void addLifecycleMessage(ref Evaluation evaluation, EquableValue[] missingValues) @safe nothrow { auto missing = missingValues.map!(a => a.getSerialized.cleanString).array; addLifecycleMessage(evaluation, missing); } /// void addNegatedLifecycleMessage(ref Evaluation evaluation, string[] presentValues) @safe nothrow { evaluation.message.addText(" "); if(presentValues.length == 1) { try evaluation.message.addValue(presentValues[0]); catch(Exception e) { evaluation.message.addText(" some value "); } evaluation.message.addText(" is present in "); } else { try evaluation.message.addValue(presentValues.niceJoin(evaluation.currentValue.typeName)); catch(Exception e) { evaluation.message.addText(" some values "); } evaluation.message.addText(" are present in "); } evaluation.message.addValue(evaluation.currentValue.strValue); evaluation.message.addText("."); } /// void addNegatedLifecycleMessage(ref Evaluation evaluation, EquableValue[] missingValues) @safe nothrow { auto missing = missingValues.map!(a => a.getSerialized).array; addNegatedLifecycleMessage(evaluation, missing); } string createResultMessage(ValueEvaluation expectedValue, string[] expectedPieces) @safe nothrow { string message = "to contain "; if(expectedPieces.length > 1) { message ~= "all "; } message ~= expectedValue.strValue; return message; } /// string createResultMessage(ValueEvaluation expectedValue, EquableValue[] missingValues) @safe nothrow { auto missing = missingValues.map!(a => a.getSerialized).array; return createResultMessage(expectedValue, missing); } string createNegatedResultMessage(ValueEvaluation expectedValue, string[] expectedPieces) @safe nothrow { string message = "to not contain "; if(expectedPieces.length > 1) { message ~= "any "; } message ~= expectedValue.strValue; return message; } /// string createNegatedResultMessage(ValueEvaluation expectedValue, EquableValue[] missingValues) @safe nothrow { auto missing = missingValues.map!(a => a.getSerialized).array; return createNegatedResultMessage(expectedValue, missing); } string niceJoin(string[] values, string typeName = "") @safe nothrow { string result = ""; try { result = values.to!string; if(!typeName.canFind("string")) { result = result.replace(`"`, ""); } } catch(Exception) {} return result; } string niceJoin(EquableValue[] values, string typeName = "") @safe nothrow { return values.map!(a => a.getSerialized.cleanString).array.niceJoin(typeName); }
module fluentasserts.core.operations.contain; import std.algorithm; import std.array; import std.conv; import fluentasserts.core.array; import fluentasserts.core.results; import fluentasserts.core.evaluation; import fluentasserts.core.serializers; import fluentasserts.core.lifecycle; version(unittest) { import fluentasserts.core.expect; } static immutable containDescription = "When the tested value is a string, it asserts that the given string val is a substring of the target. \n\n" ~ "When the tested value is an array, it asserts that the given val is inside the tested value."; /// IResult[] contain(ref Evaluation evaluation) @safe nothrow { evaluation.message.addText("."); IResult[] results = []; auto expectedPieces = evaluation.expectedValue.strValue.parseList.cleanString; auto testData = evaluation.currentValue.strValue.cleanString; if(!evaluation.isNegated) { auto missingValues = expectedPieces.filter!(a => !testData.canFind(a)).array; if(missingValues.length > 0) { addLifecycleMessage(evaluation, missingValues); try results ~= new ExpectedActualResult(createResultMessage(evaluation.expectedValue, expectedPieces), testData); catch(Exception e) { results ~= e.toResults; return results; } } } else { auto presentValues = expectedPieces.filter!(a => testData.canFind(a)).array; if(presentValues.length > 0) { string message = "to not contain "; if(presentValues.length > 1) { message ~= "any "; } message ~= evaluation.expectedValue.strValue; evaluation.message.addText(" "); if(presentValues.length == 1) { try evaluation.message.addValue(presentValues[0]); catch(Exception e) { evaluation.message.addText(" some value "); } evaluation.message.addText(" is present in "); } else { try evaluation.message.addValue(presentValues.to!string); catch(Exception e) { evaluation.message.addText(" some values "); } evaluation.message.addText(" are present in "); } evaluation.message.addValue(evaluation.currentValue.strValue); evaluation.message.addText("."); try results ~= new ExpectedActualResult(message, testData); catch(Exception e) { results ~= e.toResults; return results; } } } return results; } /// IResult[] arrayContain(ref Evaluation evaluation) @trusted nothrow { evaluation.message.addText("."); IResult[] results = []; auto expectedPieces = evaluation.expectedValue.proxyValue.toArray; auto testData = evaluation.currentValue.proxyValue.toArray; if(!evaluation.isNegated) { auto missingValues = expectedPieces.filter!(a => testData.filter!(b => b.isEqualTo(a)).empty).array; if(missingValues.length > 0) { addLifecycleMessage(evaluation, missingValues); try results ~= new ExpectedActualResult(createResultMessage(evaluation.expectedValue, expectedPieces), evaluation.currentValue.strValue); catch(Exception e) { results ~= e.toResults; return results; } } } else { auto presentValues = expectedPieces.filter!(a => !testData.filter!(b => b.isEqualTo(a)).empty).array; if(presentValues.length > 0) { addNegatedLifecycleMessage(evaluation, presentValues); try results ~= new ExpectedActualResult(createNegatedResultMessage(evaluation.expectedValue, expectedPieces), evaluation.currentValue.strValue); catch(Exception e) { results ~= e.toResults; return results; } } } return results; } /// IResult[] arrayContainOnly(ref Evaluation evaluation) @safe nothrow { evaluation.message.addText("."); IResult[] results = []; auto expectedPieces = evaluation.expectedValue.proxyValue.toArray; auto testData = evaluation.currentValue.proxyValue.toArray; auto comparison = ListComparison!EquableValue(testData, expectedPieces); EquableValue[] missing; EquableValue[] extra; EquableValue[] common; try { missing = comparison.missing; extra = comparison.extra; common = comparison.common; } catch(Exception e) { results ~= e.toResults; return results; } string strExtra = ""; string strMissing = ""; if(extra.length > 0) { strExtra = extra.niceJoin(evaluation.currentValue.typeName); } if(missing.length > 0) { strMissing = missing.niceJoin(evaluation.currentValue.typeName); } if(!evaluation.isNegated) { auto isSuccess = missing.length == 0 && extra.length == 0 && common.length == testData.length; if(!isSuccess) { try results ~= new ExpectedActualResult("", testData.niceJoin(evaluation.currentValue.typeName)); catch(Exception e) { results ~= e.toResults; return results; } try results ~= new ExtraMissingResult(strExtra, strMissing); catch(Exception e) { results ~= e.toResults; return results; } } } else { auto isSuccess = (missing.length != 0 || extra.length != 0) || common.length != testData.length; if(!isSuccess) { try results ~= new ExpectedActualResult("to not contain " ~ expectedPieces.niceJoin(evaluation.currentValue.typeName), testData.niceJoin(evaluation.currentValue.typeName)); catch(Exception e) { results ~= e.toResults; return results; } } } return results; } /// void addLifecycleMessage(ref Evaluation evaluation, string[] missingValues) @safe nothrow { evaluation.message.addText(" "); if(missingValues.length == 1) { try evaluation.message.addValue(missingValues[0]); catch(Exception) { evaluation.message.addText(" some value "); } evaluation.message.addText(" is missing from "); } else { try { evaluation.message.addValue(missingValues.niceJoin(evaluation.currentValue.typeName)); } catch(Exception) { evaluation.message.addText(" some values "); } evaluation.message.addText(" are missing from "); } evaluation.message.addValue(evaluation.currentValue.strValue); evaluation.message.addText("."); } /// void addLifecycleMessage(ref Evaluation evaluation, EquableValue[] missingValues) @safe nothrow { auto missing = missingValues.map!(a => a.getSerialized.cleanString).array; addLifecycleMessage(evaluation, missing); } /// void addNegatedLifecycleMessage(ref Evaluation evaluation, string[] presentValues) @safe nothrow { evaluation.message.addText(" "); if(presentValues.length == 1) { try evaluation.message.addValue(presentValues[0]); catch(Exception e) { evaluation.message.addText(" some value "); } evaluation.message.addText(" is present in "); } else { try evaluation.message.addValue(presentValues.niceJoin(evaluation.currentValue.typeName)); catch(Exception e) { evaluation.message.addText(" some values "); } evaluation.message.addText(" are present in "); } evaluation.message.addValue(evaluation.currentValue.strValue); evaluation.message.addText("."); } /// void addNegatedLifecycleMessage(ref Evaluation evaluation, EquableValue[] missingValues) @safe nothrow { auto missing = missingValues.map!(a => a.getSerialized).array; addNegatedLifecycleMessage(evaluation, missing); } string createResultMessage(ValueEvaluation expectedValue, string[] expectedPieces) @safe nothrow { string message = "to contain "; if(expectedPieces.length > 1) { message ~= "all "; } message ~= expectedValue.strValue; return message; } /// string createResultMessage(ValueEvaluation expectedValue, EquableValue[] missingValues) @safe nothrow { auto missing = missingValues.map!(a => a.getSerialized).array; return createResultMessage(expectedValue, missing); } string createNegatedResultMessage(ValueEvaluation expectedValue, string[] expectedPieces) @safe nothrow { string message = "to not contain "; if(expectedPieces.length > 1) { message ~= "any "; } message ~= expectedValue.strValue; return message; } /// string createNegatedResultMessage(ValueEvaluation expectedValue, EquableValue[] missingValues) @safe nothrow { auto missing = missingValues.map!(a => a.getSerialized).array; return createNegatedResultMessage(expectedValue, missing); } string niceJoin(string[] values, string typeName = "") @safe nothrow { string result = ""; try { result = values.to!string; if(!typeName.canFind("string")) { result = result.replace(`"`, ""); } } catch(Exception) {} return result; } string niceJoin(EquableValue[] values, string typeName = "") @safe nothrow { return values.map!(a => a.getSerialized.cleanString).array.niceJoin(typeName); }