| @safe pure unittest |
| { |
| import std.string; |
| |
| import std.exception : assertThrown; |
| auto bad = " a\n\tb\n c"; |
| assertThrown!StringException(bad.outdent); |
| } |
| |
| @system pure unittest |
| { |
| import std.string; |
| |
| assert(fromStringz("foo\0"c.ptr) == "foo"c); |
| assert(fromStringz("foo\0"w.ptr) == "foo"w); |
| assert(fromStringz("foo\0"d.ptr) == "foo"d); |
| |
| assert(fromStringz("福\0"c.ptr) == "福"c); |
| assert(fromStringz("福\0"w.ptr) == "福"w); |
| assert(fromStringz("福\0"d.ptr) == "福"d); |
| } |
| |
| @nogc @safe pure nothrow unittest |
| { |
| import std.string; |
| |
| struct C |
| { |
| char[32] name; |
| } |
| assert(C("foo\0"c).name.fromStringz() == "foo"c); |
| |
| struct W |
| { |
| wchar[32] name; |
| } |
| assert(W("foo\0"w).name.fromStringz() == "foo"w); |
| |
| struct D |
| { |
| dchar[32] name; |
| } |
| assert(D("foo\0"d).name.fromStringz() == "foo"d); |
| } |
| |
| pure nothrow @system unittest |
| { |
| import std.string; |
| |
| import core.stdc.string : strlen; |
| import std.conv : to; |
| |
| auto p = toStringz("foo"); |
| assert(strlen(p) == 3); |
| const(char)[] foo = "abbzxyzzy"; |
| p = toStringz(foo[3 .. 5]); |
| assert(strlen(p) == 2); |
| |
| string test = ""; |
| p = toStringz(test); |
| assert(*p == 0); |
| |
| test = "\0"; |
| p = toStringz(test); |
| assert(*p == 0); |
| |
| test = "foo\0"; |
| p = toStringz(test); |
| assert(p[0] == 'f' && p[1] == 'o' && p[2] == 'o' && p[3] == 0); |
| |
| const string test2 = ""; |
| p = toStringz(test2); |
| assert(*p == 0); |
| |
| assert(toStringz([]) is toStringz("")); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| import std.typecons : No; |
| |
| string s = "Hello World"; |
| assert(indexOf(s, 'W') == 6); |
| assert(indexOf(s, 'Z') == -1); |
| assert(indexOf(s, 'w', No.caseSensitive) == 6); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| import std.typecons : No; |
| |
| string s = "Hello World"; |
| assert(indexOf(s, 'W', 4) == 6); |
| assert(indexOf(s, 'Z', 100) == -1); |
| assert(indexOf(s, 'w', 3, No.caseSensitive) == 6); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| import std.typecons : No; |
| |
| string s = "Hello World"; |
| assert(indexOf(s, "Wo", 4) == 6); |
| assert(indexOf(s, "Zo", 100) == -1); |
| assert(indexOf(s, "wo", 3, No.caseSensitive) == 6); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| import std.typecons : No; |
| |
| string s = "Hello World"; |
| assert(indexOf(s, "Wo") == 6); |
| assert(indexOf(s, "Zo") == -1); |
| assert(indexOf(s, "wO", No.caseSensitive) == 6); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| import std.typecons : No; |
| |
| string s = "Hello World"; |
| assert(lastIndexOf(s, 'l') == 9); |
| assert(lastIndexOf(s, 'Z') == -1); |
| assert(lastIndexOf(s, 'L', No.caseSensitive) == 9); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| import std.typecons : No; |
| |
| string s = "Hello World"; |
| assert(lastIndexOf(s, 'l', 4) == 3); |
| assert(lastIndexOf(s, 'Z', 1337) == -1); |
| assert(lastIndexOf(s, 'L', 7, No.caseSensitive) == 3); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| import std.typecons : No; |
| |
| string s = "Hello World"; |
| assert(lastIndexOf(s, "ll") == 2); |
| assert(lastIndexOf(s, "Zo") == -1); |
| assert(lastIndexOf(s, "lL", No.caseSensitive) == 2); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| import std.typecons : No; |
| |
| string s = "Hello World"; |
| assert(lastIndexOf(s, "ll", 4) == 2); |
| assert(lastIndexOf(s, "Zo", 128) == -1); |
| assert(lastIndexOf(s, "lL", 3, No.caseSensitive) == -1); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| import std.conv : to; |
| |
| ptrdiff_t i = "helloWorld".indexOfAny("Wr"); |
| assert(i == 5); |
| i = "öällo world".indexOfAny("lo "); |
| assert(i == 4, to!string(i)); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| import std.conv : to; |
| |
| ptrdiff_t i = "helloWorld".indexOfAny("Wr", 4); |
| assert(i == 5); |
| |
| i = "Foo öällo world".indexOfAny("lh", 3); |
| assert(i == 8, to!string(i)); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| ptrdiff_t i = "helloWorld".lastIndexOfAny("Wlo"); |
| assert(i == 8); |
| |
| i = "Foo öäöllo world".lastIndexOfAny("öF"); |
| assert(i == 8); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| import std.conv : to; |
| |
| ptrdiff_t i = "helloWorld".lastIndexOfAny("Wlo", 4); |
| assert(i == 3); |
| |
| i = "Foo öäöllo world".lastIndexOfAny("öF", 3); |
| assert(i == 0); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| assert(indexOfNeither("abba", "a", 2) == 2); |
| assert(indexOfNeither("def", "de", 1) == 2); |
| assert(indexOfNeither("dfefffg", "dfe", 4) == 6); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| assert(indexOfNeither("def", "a") == 0); |
| assert(indexOfNeither("def", "de") == 2); |
| assert(indexOfNeither("dfefffg", "dfe") == 6); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| assert(lastIndexOfNeither("abba", "a") == 2); |
| assert(lastIndexOfNeither("def", "f") == 1); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| assert(lastIndexOfNeither("def", "rsa", 3) == -1); |
| assert(lastIndexOfNeither("abba", "a", 2) == 1); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| string s = "hello"; |
| static assert(is(typeof(representation(s)) == immutable(ubyte)[])); |
| assert(representation(s) is cast(immutable(ubyte)[]) s); |
| assert(representation(s) == [0x68, 0x65, 0x6c, 0x6c, 0x6f]); |
| } |
| |
| pure @safe unittest |
| { |
| import std.string; |
| |
| assert(capitalize("hello") == "Hello"); |
| assert(capitalize("World") == "World"); |
| } |
| |
| @safe pure nothrow unittest |
| { |
| import std.string; |
| |
| string s = "Hello\nmy\rname\nis"; |
| assert(splitLines(s) == ["Hello", "my", "name", "is"]); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| import std.array : array; |
| |
| string s = "Hello\nmy\rname\nis"; |
| |
| /* notice the call to 'array' to turn the lazy range created by |
| lineSplitter comparable to the string[] created by splitLines. |
| */ |
| assert(lineSplitter(s).array == splitLines(s)); |
| } |
| |
| @nogc @safe pure unittest |
| { |
| import std.string; |
| |
| auto s = "\rpeter\n\rpaul\r\njerry\u2028ice\u2029cream\n\nsunday\nmon\u2030day\n"; |
| auto lines = s.lineSplitter(); |
| static immutable witness = ["", "peter", "", "paul", "jerry", "ice", "cream", "", "sunday", "mon\u2030day"]; |
| uint i; |
| foreach (line; lines) |
| { |
| assert(line == witness[i++]); |
| } |
| assert(i == witness.length); |
| } |
| |
| nothrow @safe pure unittest |
| { |
| import std.string; |
| |
| import std.uni : lineSep, paraSep; |
| assert(stripLeft(" hello world ") == |
| "hello world "); |
| assert(stripLeft("\n\t\v\rhello world\n\t\v\r") == |
| "hello world\n\t\v\r"); |
| assert(stripLeft(" \u2028hello world") == |
| "hello world"); |
| assert(stripLeft("hello world") == |
| "hello world"); |
| assert(stripLeft([lineSep] ~ "hello world" ~ lineSep) == |
| "hello world" ~ [lineSep]); |
| assert(stripLeft([paraSep] ~ "hello world" ~ paraSep) == |
| "hello world" ~ [paraSep]); |
| |
| import std.array : array; |
| import std.utf : byChar; |
| assert(stripLeft(" hello world "w.byChar).array == |
| "hello world "); |
| assert(stripLeft(" \u2022hello world ".byChar).array == |
| "\u2022hello world "); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| assert(stripLeft(" hello world ", " ") == |
| "hello world "); |
| assert(stripLeft("xxxxxhello world ", "x") == |
| "hello world "); |
| assert(stripLeft("xxxyy hello world ", "xy ") == |
| "hello world "); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| import std.array : array; |
| import std.utf : byChar, byWchar, byDchar; |
| |
| assert(stripLeft(" xxxyy hello world "w.byChar, "xy ").array == |
| "hello world "); |
| |
| assert(stripLeft("\u2028\u2020hello world\u2028"w.byWchar, |
| "\u2028").array == "\u2020hello world\u2028"); |
| assert(stripLeft("\U00010001hello world"w.byWchar, " ").array == |
| "\U00010001hello world"w); |
| assert(stripLeft("\U00010001 xyhello world"d.byDchar, |
| "\U00010001 xy").array == "hello world"d); |
| |
| assert(stripLeft("\u2020hello"w, "\u2020"w) == "hello"w); |
| assert(stripLeft("\U00010001hello"d, "\U00010001"d) == "hello"d); |
| assert(stripLeft(" hello ", "") == " hello "); |
| } |
| |
| nothrow @safe pure unittest |
| { |
| import std.string; |
| |
| import std.uni : lineSep, paraSep; |
| assert(stripRight(" hello world ") == |
| " hello world"); |
| assert(stripRight("\n\t\v\rhello world\n\t\v\r") == |
| "\n\t\v\rhello world"); |
| assert(stripRight("hello world") == |
| "hello world"); |
| assert(stripRight([lineSep] ~ "hello world" ~ lineSep) == |
| [lineSep] ~ "hello world"); |
| assert(stripRight([paraSep] ~ "hello world" ~ paraSep) == |
| [paraSep] ~ "hello world"); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| assert(stripRight(" hello world ", "x") == |
| " hello world "); |
| assert(stripRight(" hello world ", " ") == |
| " hello world"); |
| assert(stripRight(" hello worldxy ", "xy ") == |
| " hello world"); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| import std.uni : lineSep, paraSep; |
| assert(strip(" hello world ") == |
| "hello world"); |
| assert(strip("\n\t\v\rhello world\n\t\v\r") == |
| "hello world"); |
| assert(strip("hello world") == |
| "hello world"); |
| assert(strip([lineSep] ~ "hello world" ~ [lineSep]) == |
| "hello world"); |
| assert(strip([paraSep] ~ "hello world" ~ [paraSep]) == |
| "hello world"); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| assert(strip(" hello world ", "x") == |
| " hello world "); |
| assert(strip(" hello world ", " ") == |
| "hello world"); |
| assert(strip(" xyxyhello worldxyxy ", "xy ") == |
| "hello world"); |
| assert(strip("\u2020hello\u2020"w, "\u2020"w) == "hello"w); |
| assert(strip("\U00010001hello\U00010001"d, "\U00010001"d) == "hello"d); |
| assert(strip(" hello ", "") == " hello "); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| assert(strip("xxhelloyy", "x", "y") == "hello"); |
| assert(strip(" xyxyhello worldxyxyzz ", "xy ", "xyz ") == |
| "hello world"); |
| assert(strip("\u2020hello\u2028"w, "\u2020"w, "\u2028"w) == "hello"w); |
| assert(strip("\U00010001hello\U00010002"d, "\U00010001"d, "\U00010002"d) == |
| "hello"d); |
| assert(strip(" hello ", "", "") == " hello "); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| import std.uni : lineSep, paraSep, nelSep; |
| import std.utf : decode; |
| assert(chomp(" hello world \n\r") == " hello world \n"); |
| assert(chomp(" hello world \r\n") == " hello world "); |
| assert(chomp(" hello world \f") == " hello world "); |
| assert(chomp(" hello world \v") == " hello world "); |
| assert(chomp(" hello world \n\n") == " hello world \n"); |
| assert(chomp(" hello world \n\n ") == " hello world \n\n "); |
| assert(chomp(" hello world \n\n" ~ [lineSep]) == " hello world \n\n"); |
| assert(chomp(" hello world \n\n" ~ [paraSep]) == " hello world \n\n"); |
| assert(chomp(" hello world \n\n" ~ [ nelSep]) == " hello world \n\n"); |
| assert(chomp(" hello world ") == " hello world "); |
| assert(chomp(" hello world") == " hello world"); |
| assert(chomp("") == ""); |
| |
| assert(chomp(" hello world", "orld") == " hello w"); |
| assert(chomp(" hello world", " he") == " hello world"); |
| assert(chomp("", "hello") == ""); |
| |
| // Don't decode pointlessly |
| assert(chomp("hello\xFE", "\r") == "hello\xFE"); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| assert(chompPrefix("hello world", "he") == "llo world"); |
| assert(chompPrefix("hello world", "hello w") == "orld"); |
| assert(chompPrefix("hello world", " world") == "hello world"); |
| assert(chompPrefix("", "hello") == ""); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| assert(chop("hello world") == "hello worl"); |
| assert(chop("hello world\n") == "hello world"); |
| assert(chop("hello world\r") == "hello world"); |
| assert(chop("hello world\n\r") == "hello world\n"); |
| assert(chop("hello world\r\n") == "hello world"); |
| assert(chop("Walter Bright") == "Walter Brigh"); |
| assert(chop("") == ""); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| assert(leftJustify("hello", 7, 'X') == "helloXX"); |
| assert(leftJustify("hello", 2, 'X') == "hello"); |
| assert(leftJustify("hello", 9, 'X') == "helloXXXX"); |
| } |
| |
| @safe pure @nogc nothrow unittest |
| { |
| import std.string; |
| |
| import std.algorithm.comparison : equal; |
| import std.utf : byChar; |
| assert(leftJustifier("hello", 2).equal("hello".byChar)); |
| assert(leftJustifier("hello", 7).equal("hello ".byChar)); |
| assert(leftJustifier("hello", 7, 'x').equal("helloxx".byChar)); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| assert(rightJustify("hello", 7, 'X') == "XXhello"); |
| assert(rightJustify("hello", 2, 'X') == "hello"); |
| assert(rightJustify("hello", 9, 'X') == "XXXXhello"); |
| } |
| |
| @safe pure @nogc nothrow unittest |
| { |
| import std.string; |
| |
| import std.algorithm.comparison : equal; |
| import std.utf : byChar; |
| assert(rightJustifier("hello", 2).equal("hello".byChar)); |
| assert(rightJustifier("hello", 7).equal(" hello".byChar)); |
| assert(rightJustifier("hello", 7, 'x').equal("xxhello".byChar)); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| assert(center("hello", 7, 'X') == "XhelloX"); |
| assert(center("hello", 2, 'X') == "hello"); |
| assert(center("hello", 9, 'X') == "XXhelloXX"); |
| } |
| |
| @safe pure @nogc nothrow unittest |
| { |
| import std.string; |
| |
| import std.algorithm.comparison : equal; |
| import std.utf : byChar; |
| assert(centerJustifier("hello", 2).equal("hello".byChar)); |
| assert(centerJustifier("hello", 8).equal(" hello ".byChar)); |
| assert(centerJustifier("hello", 7, 'x').equal("xhellox".byChar)); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| assert(detab(" \n\tx", 9) == " \n x"); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| import std.array : array; |
| |
| assert(detabber(" \n\tx", 9).array == " \n x"); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| import std.array : array; |
| import std.utf : byChar, byWchar; |
| |
| assert(detabber(" \u2029\t".byChar, 9).array == " \u2029 "); |
| auto r = "hel\tx".byWchar.detabber(); |
| assert(r.front == 'h'); |
| auto s = r.save; |
| r.popFront(); |
| r.popFront(); |
| assert(r.front == 'l'); |
| assert(s.front == 'h'); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| assert(entab(" x \n") == "\tx\n"); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| import std.array : array; |
| assert(entabber(" x \n").array == "\tx\n"); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| dchar[dchar] transTable1 = ['e' : '5', 'o' : '7', '5': 'q']; |
| assert(translate("hello world", transTable1) == "h5ll7 w7rld"); |
| |
| assert(translate("hello world", transTable1, "low") == "h5 rd"); |
| |
| string[dchar] transTable2 = ['e' : "5", 'o' : "orange"]; |
| assert(translate("hello world", transTable2) == "h5llorange worangerld"); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| import std.array : appender; |
| dchar[dchar] transTable1 = ['e' : '5', 'o' : '7', '5': 'q']; |
| auto buffer = appender!(dchar[])(); |
| translate("hello world", transTable1, null, buffer); |
| assert(buffer.data == "h5ll7 w7rld"); |
| |
| buffer.clear(); |
| translate("hello world", transTable1, "low", buffer); |
| assert(buffer.data == "h5 rd"); |
| |
| buffer.clear(); |
| string[dchar] transTable2 = ['e' : "5", 'o' : "orange"]; |
| translate("hello world", transTable2, null, buffer); |
| assert(buffer.data == "h5llorange worangerld"); |
| } |
| |
| @safe pure nothrow unittest |
| { |
| import std.string; |
| |
| auto transTable1 = makeTrans("eo5", "57q"); |
| assert(translate("hello world", transTable1) == "h5ll7 w7rld"); |
| |
| assert(translate("hello world", transTable1, "low") == "h5 rd"); |
| } |
| |
| @safe pure nothrow unittest |
| { |
| import std.string; |
| |
| auto transTable1 = makeTrans("eo5", "57q"); |
| assert(translate("hello world", transTable1) == "h5ll7 w7rld"); |
| |
| assert(translate("hello world", transTable1, "low") == "h5 rd"); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| assert(translate("hello world", makeTransTable("hl", "q5")) == "qe55o wor5d"); |
| assert(translate("hello world", makeTransTable("12345", "67890")) == "hello world"); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| import std.array : appender; |
| auto buffer = appender!(char[])(); |
| auto transTable1 = makeTransTable("eo5", "57q"); |
| translate("hello world", transTable1, null, buffer); |
| assert(buffer.data == "h5ll7 w7rld"); |
| |
| buffer.clear(); |
| translate("hello world", transTable1, "low", buffer); |
| assert(buffer.data == "h5 rd"); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| assert(succ("1") == "2"); |
| assert(succ("9") == "10"); |
| assert(succ("999") == "1000"); |
| assert(succ("zz99") == "aaa00"); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| assert(tr("abcdef", "cd", "CD") == "abCDef"); |
| assert(tr("1st March, 2018", "March", "MAR", "s") == "1st MAR, 2018"); |
| assert(tr("abcdef", "ef", "", "d") == "abcd"); |
| assert(tr("14-Jul-87", "a-zA-Z", " ", "cs") == " Jul "); |
| } |
| |
| @safe @nogc pure nothrow unittest |
| { |
| import std.string; |
| |
| assert(isNumeric("123")); |
| assert(isNumeric("123UL")); |
| assert(isNumeric("123L")); |
| assert(isNumeric("+123U")); |
| assert(isNumeric("-123L")); |
| } |
| |
| @safe @nogc pure nothrow unittest |
| { |
| import std.string; |
| |
| assert(isNumeric("+123")); |
| assert(isNumeric("-123.01")); |
| assert(isNumeric("123.3e-10f")); |
| assert(isNumeric("123.3e-10fi")); |
| assert(isNumeric("123.3e-10L")); |
| |
| assert(isNumeric("nan")); |
| assert(isNumeric("nani")); |
| assert(isNumeric("-inf")); |
| } |
| |
| @safe @nogc pure nothrow unittest |
| { |
| import std.string; |
| |
| assert(isNumeric("-123e-1+456.9e-10Li")); |
| assert(isNumeric("+123e+10+456i")); |
| assert(isNumeric("123+456")); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| enum a = isNumeric("123.00E-5+1234.45E-12Li"); |
| enum b = isNumeric("12345xxxx890"); |
| |
| static assert( a); |
| static assert(!b); |
| } |
| |
| @safe unittest |
| { |
| import std.string; |
| |
| assert(soundexer("Gauss") == "G200"); |
| assert(soundexer("Ghosh") == "G200"); |
| |
| assert(soundexer("Robert") == "R163"); |
| assert(soundexer("Rupert") == "R163"); |
| |
| assert(soundexer("0123^&^^**&^") == ['\0', '\0', '\0', '\0']); |
| } |
| |
| @safe unittest |
| { |
| import std.string; |
| |
| assert(soundex("Gauss") == "G200"); |
| assert(soundex("Ghosh") == "G200"); |
| |
| assert(soundex("Robert") == "R163"); |
| assert(soundex("Rupert") == "R163"); |
| |
| assert(soundex("0123^&^^**&^") == null); |
| } |
| |
| @safe unittest |
| { |
| import std.string; |
| |
| import std.string; |
| |
| static string[] list = [ "food", "foxy" ]; |
| auto abbrevs = abbrev(list); |
| assert(abbrevs == ["fox": "foxy", "food": "food", |
| "foxy": "foxy", "foo": "food"]); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| import std.utf : byChar, byWchar, byDchar; |
| |
| assert(column("1234 ") == 5); |
| assert(column("1234 "w) == 5); |
| assert(column("1234 "d) == 5); |
| |
| assert(column("1234 ".byChar()) == 5); |
| assert(column("1234 "w.byWchar()) == 5); |
| assert(column("1234 "d.byDchar()) == 5); |
| |
| // Tab stops are set at 8 spaces by default; tab characters insert enough |
| // spaces to bring the column position to the next multiple of 8. |
| assert(column("\t") == 8); |
| assert(column("1\t") == 8); |
| assert(column("\t1") == 9); |
| assert(column("123\t") == 8); |
| |
| // Other tab widths are possible by specifying it explicitly: |
| assert(column("\t", 4) == 4); |
| assert(column("1\t", 4) == 4); |
| assert(column("\t1", 4) == 5); |
| assert(column("123\t", 4) == 4); |
| |
| // New lines reset the column number. |
| assert(column("abc\n") == 0); |
| assert(column("abc\n1") == 1); |
| assert(column("abcdefg\r1234") == 4); |
| assert(column("abc\u20281") == 1); |
| assert(column("abc\u20291") == 1); |
| assert(column("abc\u00851") == 1); |
| assert(column("abc\u00861") == 5); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| assert(wrap("a short string", 7) == "a short\nstring\n"); |
| |
| // wrap will not break inside of a word, but at the next space |
| assert(wrap("a short string", 4) == "a\nshort\nstring\n"); |
| |
| assert(wrap("a short string", 7, "\t") == "\ta\nshort\nstring\n"); |
| assert(wrap("a short string", 7, "\t", " ") == "\ta\n short\n string\n"); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| enum pretty = q{ |
| import std.stdio; |
| void main() { |
| writeln("Hello"); |
| } |
| }.outdent(); |
| |
| enum ugly = q{ |
| import std.stdio; |
| void main() { |
| writeln("Hello"); |
| } |
| }; |
| |
| assert(pretty == ugly); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| auto str1 = [ |
| " void main()\n", |
| " {\n", |
| " test();\n", |
| " }\n" |
| ]; |
| auto str1Expected = [ |
| "void main()\n", |
| "{\n", |
| " test();\n", |
| "}\n" |
| ]; |
| assert(str1.outdent == str1Expected); |
| |
| auto str2 = [ |
| "void main()\n", |
| " {\n", |
| " test();\n", |
| " }\n" |
| ]; |
| assert(str2.outdent == str2); |
| } |
| |
| @safe pure unittest |
| { |
| import std.string; |
| |
| string a = "Hölo World"; |
| immutable(ubyte)[] b = a.representation; |
| string c = b.assumeUTF; |
| |
| assert(c == "Hölo World"); |
| } |
| |