Remove tagcmp (#223)

Remove tagcmp
merged-on-behalf-of: Basile-z <Basile-z@users.noreply.github.com>
This commit is contained in:
Cameron Ross 2019-01-19 23:12:59 -03:30 committed by The Dlang Bot
parent 59954acb49
commit 9d83c6a478
3 changed files with 799 additions and 209 deletions

View file

@ -79,22 +79,16 @@ private struct Pair
/// Equality test with another Pair.
bool opEquals(const ref Pair rhs) const @safe
{
return cmp!(Yes.useTag)(rhs) == 0;
return key == rhs.key && value == rhs.value;
}
private:
// Comparison with another Pair.
//
// useTag determines whether or not we consider node tags
// in the comparison.
// Note: @safe isn't properly inferred in single-file builds due to a bug.
int cmp(Flag!"useTag" useTag)(ref const(Pair) rhs) const @safe
int opCmp(ref const(Pair) rhs) const @safe
{
const keyCmp = key.cmp!useTag(rhs.key);
const keyCmp = key.opCmp(rhs.key);
return keyCmp != 0 ? keyCmp
: value.cmp!useTag(rhs.value);
: value.opCmp(rhs.value);
}
@disable int opCmp(ref Pair);
}
enum NodeType
@ -447,9 +441,29 @@ struct Node
*
* Returns: true if equal, false otherwise.
*/
bool opEquals(const Node rhs) const @safe
{
return opCmp(rhs) == 0;
}
bool opEquals(T)(const auto ref T rhs) const
{
return equals!(Yes.useTag)(rhs);
try
{
auto stored = get!(T, No.stringConversion);
// NaNs aren't normally equal to each other, but we'll pretend they are.
static if(isFloatingPoint!T)
{
return rhs == stored || (isNaN(rhs) && isNaN(stored));
}
else
{
return rhs == stored;
}
}
catch(NodeException e)
{
return false;
}
}
///
@safe unittest
@ -772,6 +786,40 @@ struct Node
Node node = loader.load();
assert(node.as!MyClass == new MyClass(1,2,3));
}
// Make sure custom tags and styles are kept.
@safe unittest
{
static struct MyStruct
{
Node opCast(T: Node)()
{
auto node = Node("hi", "!mystruct.tag");
node.setStyle(ScalarStyle.doubleQuoted);
return node;
}
}
auto node = Node(MyStruct.init);
assert(node.tag == "!mystruct.tag");
assert(node.scalarStyle == ScalarStyle.doubleQuoted);
}
// ditto, but for collection style
@safe unittest
{
static struct MyStruct
{
Node opCast(T: Node)()
{
auto node = Node(["hi"], "!mystruct.tag");
node.setStyle(CollectionStyle.flow);
return node;
}
}
auto node = Node(MyStruct.init);
assert(node.tag == "!mystruct.tag");
assert(node.collectionStyle == CollectionStyle.flow);
}
@safe unittest
{
assertThrown!NodeException(Node("42").get!int);
@ -1875,69 +1923,12 @@ struct Node
}
/// Compare with another _node.
int opCmp(ref const Node node) const @safe
{
return cmp!(Yes.useTag)(node);
}
// Compute hash of the node.
hash_t toHash() nothrow const @trusted
{
const valueHash = value_.toHash();
return tag_ is null ? valueHash : tag_.hashOf(valueHash);
}
@safe unittest
{
assert(Node(42).toHash() != Node(41).toHash());
assert(Node(42).toHash() != Node(42, "some-tag").toHash());
}
package:
// Equality test with any value.
//
// useTag determines whether or not to consider tags in node-node comparisons.
bool equals(Flag!"useTag" useTag, T)(ref T rhs) const
{
static if(is(Unqual!T == Node))
{
return cmp!useTag(rhs) == 0;
}
else
{
try
{
auto stored = get!(T, No.stringConversion);
// Need to handle NaNs separately.
static if(isFloatingPoint!T)
{
return rhs == stored || (isNaN(rhs) && isNaN(stored));
}
else
{
return rhs == get!T;
}
}
catch(NodeException e){return false;}
}
}
// Comparison with another node.
//
// Used for ordering in mappings and for opEquals.
//
// useTag determines whether or not to consider tags in the comparison.
// TODO: Make @safe when TypeInfo.cmp is @safe as well.
int cmp(Flag!"useTag" useTag)(const ref Node rhs) const @trusted
int opCmp(const ref Node rhs) const @safe
{
// Compare tags - if equal or both null, we need to compare further.
static if(useTag)
{
const tagCmp = (tag_ is null) ? (rhs.tag_ is null) ? 0 : -1
: (rhs.tag_ is null) ? 1 : std.algorithm.comparison.cmp(tag_, rhs.tag_);
if(tagCmp != 0){return tagCmp;}
}
const tagCmp = (tag_ is null) ? (rhs.tag_ is null) ? 0 : -1
: (rhs.tag_ is null) ? 1 : std.algorithm.comparison.cmp(tag_, rhs.tag_);
if(tagCmp != 0){return tagCmp;}
static int cmp(T1, T2)(T1 a, T2 b)
{
@ -1952,7 +1943,7 @@ struct Node
if(!v1){return v2 ? -1 : 0;}
if(!v2){return 1;}
const typeCmp = type.opCmp(rhs.type);
const typeCmp = cmp(newType, rhs.newType);
if(typeCmp != 0){return typeCmp;}
static int compareCollections(T)(const ref Node lhs, const ref Node rhs)
@ -1967,7 +1958,7 @@ struct Node
// Equal lengths, compare items.
foreach(i; 0 .. c1.length)
{
const itemCmp = c1[i].cmp!useTag(c2[i]);
const itemCmp = c1[i].opCmp(c2[i]);
if(itemCmp != 0){return itemCmp;}
}
return 0;
@ -2031,6 +2022,40 @@ struct Node
assert(false, "Unknown type of node for comparison : " ~ type.toString());
}
// Ensure opCmp is symmetric for collections
@safe unittest
{
auto node1 = Node(
[
Node("New York Yankees", "tag:yaml.org,2002:str"),
Node("Atlanta Braves", "tag:yaml.org,2002:str")
], "tag:yaml.org,2002:seq"
);
auto node2 = Node(
[
Node("Detroit Tigers", "tag:yaml.org,2002:str"),
Node("Chicago cubs", "tag:yaml.org,2002:str")
], "tag:yaml.org,2002:seq"
);
assert(node1 > node2);
assert(node2 < node1);
}
// Compute hash of the node.
hash_t toHash() nothrow const @trusted
{
const valueHash = value_.toHash();
return tag_ is null ? valueHash : tag_.hashOf(valueHash);
}
@safe unittest
{
assert(Node(42).toHash() != Node(41).toHash());
assert(Node(42).toHash() != Node(42, "some-tag").toHash());
}
package:
// Get a string representation of the node tree. Used for debugging.
//
// Params: level = Level of the node in the tree.
@ -2404,7 +2429,11 @@ struct Node
}
else
{
value_ = (cast(Node)value).value_;
auto tmpNode = cast(Node)value;
tag_ = tmpNode.tag;
scalarStyle = tmpNode.scalarStyle;
collectionStyle = tmpNode.collectionStyle;
value_ = tmpNode.value_;
}
}
}

View file

@ -66,7 +66,14 @@ Node.Pair pair(A, B)(A a, B b)
Node[] constructAliasesCDumperBug() @safe
{
return [Node(["today", "today"])];
return [
Node(
[
Node("today", "tag:yaml.org,2002:str"),
Node("today", "tag:yaml.org,2002:str")
],
"tag:yaml.org,2002:seq")
];
}
Node[] constructBinary() @safe
@ -75,9 +82,24 @@ Node[] constructBinary() @safe
auto generic = "GIF89a\x0c\x00\x0c\x00\x84\x00\x00\xff\xff\xf7\xf5\xf5\xee\xe9\xe9\xe5fff\x00\x00\x00\xe7\xe7\xe7^^^\xf3\xf3\xed\x8e\x8e\x8e\xe0\xe0\xe0\x9f\x9f\x9f\x93\x93\x93\xa7\xa7\xa7\x9e\x9e\x9eiiiccc\xa3\xa3\xa3\x84\x84\x84\xff\xfe\xf9\xff\xfe\xf9\xff\xfe\xf9\xff\xfe\xf9\xff\xfe\xf9\xff\xfe\xf9\xff\xfe\xf9\xff\xfe\xf9\xff\xfe\xf9\xff\xfe\xf9\xff\xfe\xf9\xff\xfe\xf9\xff\xfe\xf9\xff\xfe\xf9!\xfe\x0eMade with GIMP\x00,\x00\x00\x00\x00\x0c\x00\x0c\x00\x00\x05, \x8e\x810\x9e\xe3@\x14\xe8i\x10\xc4\xd1\x8a\x08\x1c\xcf\x80M$z\xef\xff0\x85p\xb8\xb01f\r\x1b\xce\x01\xc3\x01\x1e\x10' \x82\n\x01\x00;".representation.dup;
auto description = "The binary value above is a tiny arrow encoded as a gif image.";
return [Node([pair("canonical", canonical),
pair("generic", generic),
pair("description", description)])];
return [
Node(
[
pair(
Node("canonical", "tag:yaml.org,2002:str"),
Node(canonical, "tag:yaml.org,2002:binary")
),
pair(
Node("generic", "tag:yaml.org,2002:str"),
Node(generic, "tag:yaml.org,2002:binary")
),
pair(
Node("description", "tag:yaml.org,2002:str"),
Node(description, "tag:yaml.org,2002:str")
)
],
"tag:yaml.org,2002:map")
];
}
Node[] constructBool() @safe
@ -86,234 +108,761 @@ Node[] constructBool() @safe
immutable(bool) b = true;
const bool aa = true;
immutable bool bb = true;
return [Node([pair("canonical", true),
pair("answer", false),
pair("logical", true),
pair("option", true),
pair("constbool", a),
pair("imutbool", b),
pair("const_bool", aa),
pair("imut_bool", bb),
pair("but", [pair("y", "is a string"), pair("n", "is a string")])])];
return [
Node(
[
pair(
Node("canonical", "tag:yaml.org,2002:str"),
Node(true, "tag:yaml.org,2002:bool")
),
pair(
Node("answer", "tag:yaml.org,2002:str"),
Node(false, "tag:yaml.org,2002:bool")
),
pair(
Node("logical", "tag:yaml.org,2002:str"),
Node(true, "tag:yaml.org,2002:bool")
),
pair(
Node("option", "tag:yaml.org,2002:str"),
Node(true, "tag:yaml.org,2002:bool")
),
pair(
Node("constbool", "tag:yaml.org,2002:str"),
Node(a, "tag:yaml.org,2002:bool")
),
pair(
Node("imutbool", "tag:yaml.org,2002:str"),
Node(b, "tag:yaml.org,2002:bool")
),
pair(
Node("const_bool", "tag:yaml.org,2002:str"),
Node(aa, "tag:yaml.org,2002:bool")
),
pair(
Node("imut_bool", "tag:yaml.org,2002:str"),
Node(bb, "tag:yaml.org,2002:bool")
),
pair(
Node("but", "tag:yaml.org,2002:str"),
Node(
[
pair(
Node("y", "tag:yaml.org,2002:str"),
Node("is a string", "tag:yaml.org,2002:str")
),
pair(
Node("n", "tag:yaml.org,2002:str"),
Node("is a string", "tag:yaml.org,2002:str")
)
],
"tag:yaml.org,2002:map")
)
],
"tag:yaml.org,2002:map")
];
}
Node[] constructCustom() @safe
{
return [Node([Node(new TestClass(1, 2, 3)),
Node(TestStruct(10))])];
return [
Node(
[
Node(new TestClass(1, 2, 3)),
Node(TestStruct(10))
],
"tag:yaml.org,2002:seq")
];
}
Node[] constructFloat() @safe
{
return [Node([pair("canonical", 685230.15L),
pair("exponential", 685230.15L),
pair("fixed", 685230.15L),
pair("sexagesimal", 685230.15L),
pair("negative infinity", -real.infinity),
pair("not a number", real.nan)])];
return [
Node(
[
pair(
Node("canonical", "tag:yaml.org,2002:str"),
Node(685230.15L, "tag:yaml.org,2002:float")
),
pair(
Node("exponential", "tag:yaml.org,2002:str"),
Node(685230.15L, "tag:yaml.org,2002:float")
),
pair(
Node("fixed", "tag:yaml.org,2002:str"),
Node(685230.15L, "tag:yaml.org,2002:float")
),
pair(
Node("sexagesimal", "tag:yaml.org,2002:str"),
Node(685230.15L, "tag:yaml.org,2002:float")
),
pair(
Node("negative infinity", "tag:yaml.org,2002:str"),
Node(-real.infinity, "tag:yaml.org,2002:float")
),
pair(
Node("not a number", "tag:yaml.org,2002:str"),
Node(real.nan, "tag:yaml.org,2002:float")
)
],
"tag:yaml.org,2002:map")
];
}
Node[] constructInt() @safe
{
return [Node([pair("canonical", 685230L),
pair("decimal", 685230L),
pair("octal", 685230L),
pair("hexadecimal", 685230L),
pair("binary", 685230L),
pair("sexagesimal", 685230L)])];
return [
Node(
[
pair(
Node("canonical", "tag:yaml.org,2002:str"),
Node(685230L, "tag:yaml.org,2002:int")
),
pair(
Node("decimal", "tag:yaml.org,2002:str"),
Node(685230L, "tag:yaml.org,2002:int")
),
pair(
Node("octal", "tag:yaml.org,2002:str"),
Node(685230L, "tag:yaml.org,2002:int")
),
pair(
Node("hexadecimal", "tag:yaml.org,2002:str"),
Node(685230L, "tag:yaml.org,2002:int")
),
pair(
Node("binary", "tag:yaml.org,2002:str"),
Node(685230L, "tag:yaml.org,2002:int")
),
pair(
Node("sexagesimal", "tag:yaml.org,2002:str"),
Node(685230L, "tag:yaml.org,2002:int")
)
],
"tag:yaml.org,2002:map")
];
}
Node[] constructMap() @safe
{
return [Node([pair("Block style",
[pair("Clark", "Evans"),
pair("Brian", "Ingerson"),
pair("Oren", "Ben-Kiki")]),
pair("Flow style",
[pair("Clark", "Evans"),
pair("Brian", "Ingerson"),
pair("Oren", "Ben-Kiki")])])];
return [
Node(
[
pair(
Node("Block style", "tag:yaml.org,2002:str"),
Node(
[
pair(
Node("Clark", "tag:yaml.org,2002:str"),
Node("Evans", "tag:yaml.org,2002:str")
),
pair(
Node("Brian", "tag:yaml.org,2002:str"),
Node("Ingerson", "tag:yaml.org,2002:str")
),
pair(
Node("Oren", "tag:yaml.org,2002:str"),
Node("Ben-Kiki", "tag:yaml.org,2002:str")
)
],
"tag:yaml.org,2002:map")
),
pair(
Node("Flow style", "tag:yaml.org,2002:str"),
Node(
[
pair(
Node("Clark", "tag:yaml.org,2002:str"),
Node("Evans", "tag:yaml.org,2002:str")
),
pair(
Node("Brian", "tag:yaml.org,2002:str"),
Node("Ingerson", "tag:yaml.org,2002:str")
),
pair(
Node("Oren", "tag:yaml.org,2002:str"),
Node("Ben-Kiki", "tag:yaml.org,2002:str")
)
],
"tag:yaml.org,2002:map")
)
],
"tag:yaml.org,2002:map")
];
}
Node[] constructMerge() @safe
{
return [Node([Node([pair("x", 1L), pair("y", 2L)]),
Node([pair("x", 0L), pair("y", 2L)]),
Node([pair("r", 10L)]),
Node([pair("r", 1L)]),
Node([pair("x", 1L), pair("y", 2L), pair("r", 10L), pair("label", "center/big")]),
Node([pair("r", 10L), pair("label", "center/big"), pair("x", 1L), pair("y", 2L)]),
Node([pair("label", "center/big"), pair("x", 1L), pair("y", 2L), pair("r", 10L)]),
Node([pair("x", 1L), pair("label", "center/big"), pair("r", 10L), pair("y", 2L)])])];
return [
Node(
[
Node(
[
pair(
Node("x", "tag:yaml.org,2002:str"),
Node(1L, "tag:yaml.org,2002:int")
),
pair(
Node("y", "tag:yaml.org,2002:str"),
Node(2L, "tag:yaml.org,2002:int")
)
],
"tag:yaml.org,2002:map"),
Node(
[
pair(
Node("x", "tag:yaml.org,2002:str"),
Node(0L, "tag:yaml.org,2002:int")
),
pair(
Node("y", "tag:yaml.org,2002:str"),
Node(2L, "tag:yaml.org,2002:int")
)
],
"tag:yaml.org,2002:map"),
Node(
[
pair(
Node("r", "tag:yaml.org,2002:str"),
Node(10L, "tag:yaml.org,2002:int")
)
],
"tag:yaml.org,2002:map"),
Node(
[
pair(
Node("r", "tag:yaml.org,2002:str"),
Node(1L, "tag:yaml.org,2002:int")
)
],
"tag:yaml.org,2002:map"),
Node(
[
pair(
Node("x", "tag:yaml.org,2002:str"),
Node(1L, "tag:yaml.org,2002:int")
),
pair(
Node("y", "tag:yaml.org,2002:str"),
Node(2L, "tag:yaml.org,2002:int")
),
pair(
Node("r", "tag:yaml.org,2002:str"),
Node(10L, "tag:yaml.org,2002:int")
),
pair(
Node("label", "tag:yaml.org,2002:str"),
Node("center/big", "tag:yaml.org,2002:str")
)
],
"tag:yaml.org,2002:map"),
Node(
[
pair(
Node("r", "tag:yaml.org,2002:str"),
Node(10L, "tag:yaml.org,2002:int")
),
pair(
Node("label", "tag:yaml.org,2002:str"),
Node("center/big", "tag:yaml.org,2002:str")
),
pair(
Node("x", "tag:yaml.org,2002:str"),
Node(1L, "tag:yaml.org,2002:int")
),
pair(
Node("y", "tag:yaml.org,2002:str"),
Node(2L, "tag:yaml.org,2002:int")
)
],
"tag:yaml.org,2002:map"),
Node(
[
pair(
Node("label", "tag:yaml.org,2002:str"),
Node("center/big", "tag:yaml.org,2002:str")
),
pair(
Node("x", "tag:yaml.org,2002:str"),
Node(1L, "tag:yaml.org,2002:int")
),
pair(
Node("y", "tag:yaml.org,2002:str"),
Node(2L, "tag:yaml.org,2002:int")
),
pair(
Node("r", "tag:yaml.org,2002:str"),
Node(10L, "tag:yaml.org,2002:int")
)
],
"tag:yaml.org,2002:map"),
Node(
[
pair(
Node("x", "tag:yaml.org,2002:str"),
Node(1L, "tag:yaml.org,2002:int")
),
pair(
Node("label", "tag:yaml.org,2002:str"),
Node("center/big", "tag:yaml.org,2002:str")
),
pair(
Node("r", "tag:yaml.org,2002:str"),
Node(10L, "tag:yaml.org,2002:int")
),
pair(
Node("y", "tag:yaml.org,2002:str"),
Node(2L, "tag:yaml.org,2002:int")
)
],
"tag:yaml.org,2002:map")
],
"tag:yaml.org,2002:seq")
];
}
Node[] constructNull() @safe
{
return [Node(YAMLNull()),
Node([pair("empty", YAMLNull()),
pair("canonical", YAMLNull()),
pair("english", YAMLNull()),
pair(YAMLNull(), "null key")]),
Node([pair("sparse",
[Node(YAMLNull()),
Node("2nd entry"),
Node(YAMLNull()),
Node("4th entry"),
Node(YAMLNull())])])];
return [
Node(YAMLNull(), "tag:yaml.org,2002:null"),
Node(
[
pair(
Node("empty", "tag:yaml.org,2002:str"),
Node(YAMLNull(), "tag:yaml.org,2002:null")
),
pair(
Node("canonical", "tag:yaml.org,2002:str"),
Node(YAMLNull(), "tag:yaml.org,2002:null")
),
pair(
Node("english", "tag:yaml.org,2002:str"),
Node(YAMLNull(), "tag:yaml.org,2002:null")
),
pair(
Node(YAMLNull(), "tag:yaml.org,2002:null"),
Node("null key", "tag:yaml.org,2002:str")
)
],
"tag:yaml.org,2002:map"),
Node(
[
pair(
Node("sparse", "tag:yaml.org,2002:str"),
Node(
[
Node(YAMLNull(), "tag:yaml.org,2002:null"),
Node("2nd entry", "tag:yaml.org,2002:str"),
Node(YAMLNull(), "tag:yaml.org,2002:null"),
Node("4th entry", "tag:yaml.org,2002:str"),
Node(YAMLNull(), "tag:yaml.org,2002:null")
],
"tag:yaml.org,2002:seq")
)
],
"tag:yaml.org,2002:map")
];
}
Node[] constructOMap() @safe
{
return [Node([pair("Bestiary",
[pair("aardvark", "African pig-like ant eater. Ugly."),
pair("anteater", "South-American ant eater. Two species."),
pair("anaconda", "South-American constrictor snake. Scaly.")]),
pair("Numbers",[pair("one", 1L),
pair("two", 2L),
pair("three", 3L)])])];
return [
Node(
[
pair(
Node("Bestiary", "tag:yaml.org,2002:str"),
Node(
[
pair(
Node("aardvark", "tag:yaml.org,2002:str"),
Node("African pig-like ant eater. Ugly.", "tag:yaml.org,2002:str")
),
pair(
Node("anteater", "tag:yaml.org,2002:str"),
Node("South-American ant eater. Two species.", "tag:yaml.org,2002:str")
),
pair(
Node("anaconda", "tag:yaml.org,2002:str"),
Node("South-American constrictor snake. Scaly.", "tag:yaml.org,2002:str")
)
],
"tag:yaml.org,2002:omap")
),
pair(
Node("Numbers", "tag:yaml.org,2002:str"),
Node(
[
pair(
Node("one", "tag:yaml.org,2002:str"),
Node(1L, "tag:yaml.org,2002:int")
),
pair(
Node("two", "tag:yaml.org,2002:str"),
Node(2L, "tag:yaml.org,2002:int")
),
pair(
Node("three", "tag:yaml.org,2002:str"),
Node(3L, "tag:yaml.org,2002:int")
)
],
"tag:yaml.org,2002:omap")
)
],
"tag:yaml.org,2002:map")
];
}
Node[] constructPairs() @safe
{
return [Node([pair("Block tasks",
Node([pair("meeting", "with team."),
pair("meeting", "with boss."),
pair("break", "lunch."),
pair("meeting", "with client.")], "tag:yaml.org,2002:pairs")),
pair("Flow tasks",
Node([pair("meeting", "with team"),
pair("meeting", "with boss")], "tag:yaml.org,2002:pairs"))])];
return [
Node(
[
pair(
Node("Block tasks", "tag:yaml.org,2002:str"),
Node(
[
pair(Node("meeting", "tag:yaml.org,2002:str"), Node("with team.", "tag:yaml.org,2002:str")),
pair(Node("meeting", "tag:yaml.org,2002:str"), Node("with boss.", "tag:yaml.org,2002:str")),
pair(Node("break", "tag:yaml.org,2002:str"), Node("lunch.", "tag:yaml.org,2002:str")),
pair(Node("meeting", "tag:yaml.org,2002:str"), Node("with client.", "tag:yaml.org,2002:str"))
],
"tag:yaml.org,2002:pairs")
),
pair(
Node("Flow tasks", "tag:yaml.org,2002:str"),
Node(
[
pair(Node("meeting", "tag:yaml.org,2002:str"), Node("with team", "tag:yaml.org,2002:str")),
pair(Node("meeting", "tag:yaml.org,2002:str"), Node("with boss", "tag:yaml.org,2002:str"))
],
"tag:yaml.org,2002:pairs")
)
],
"tag:yaml.org,2002:map")
];
}
Node[] constructSeq() @safe
{
return [Node([pair("Block style",
[Node("Mercury"), Node("Venus"), Node("Earth"), Node("Mars"),
Node("Jupiter"), Node("Saturn"), Node("Uranus"), Node("Neptune"),
Node("Pluto")]),
pair("Flow style",
[Node("Mercury"), Node("Venus"), Node("Earth"), Node("Mars"),
Node("Jupiter"), Node("Saturn"), Node("Uranus"), Node("Neptune"),
Node("Pluto")])])];
return [
Node(
[
pair(
Node("Block style", "tag:yaml.org,2002:str"),
Node([
Node("Mercury", "tag:yaml.org,2002:str"),
Node("Venus", "tag:yaml.org,2002:str"),
Node("Earth", "tag:yaml.org,2002:str"),
Node("Mars", "tag:yaml.org,2002:str"),
Node("Jupiter", "tag:yaml.org,2002:str"),
Node("Saturn", "tag:yaml.org,2002:str"),
Node("Uranus", "tag:yaml.org,2002:str"),
Node("Neptune", "tag:yaml.org,2002:str"),
Node("Pluto", "tag:yaml.org,2002:str")
], "tag:yaml.org,2002:seq")
),
pair(
Node("Flow style", "tag:yaml.org,2002:str"),
Node([
Node("Mercury", "tag:yaml.org,2002:str"),
Node("Venus", "tag:yaml.org,2002:str"),
Node("Earth", "tag:yaml.org,2002:str"),
Node("Mars", "tag:yaml.org,2002:str"),
Node("Jupiter", "tag:yaml.org,2002:str"),
Node("Saturn", "tag:yaml.org,2002:str"),
Node("Uranus", "tag:yaml.org,2002:str"),
Node("Neptune", "tag:yaml.org,2002:str"),
Node("Pluto", "tag:yaml.org,2002:str")
], "tag:yaml.org,2002:seq")
)
],
"tag:yaml.org,2002:map")
];
}
Node[] constructSet() @safe
{
return [Node([pair("baseball players",
[Node("Mark McGwire"), Node("Sammy Sosa"), Node("Ken Griffey")]),
pair("baseball teams",
[Node("Boston Red Sox"), Node("Detroit Tigers"), Node("New York Yankees")])])];
return [
Node(
[
pair(
Node("baseball players", "tag:yaml.org,2002:str"),
Node(
[
Node("Mark McGwire", "tag:yaml.org,2002:str"),
Node("Sammy Sosa", "tag:yaml.org,2002:str"),
Node("Ken Griffey", "tag:yaml.org,2002:str")
],
"tag:yaml.org,2002:set")
),
pair(
Node("baseball teams", "tag:yaml.org,2002:str"),
Node(
[
Node("Boston Red Sox", "tag:yaml.org,2002:str"),
Node("Detroit Tigers", "tag:yaml.org,2002:str"),
Node("New York Yankees", "tag:yaml.org,2002:str")
],
"tag:yaml.org,2002:set")
)
],
"tag:yaml.org,2002:map")
];
}
Node[] constructStrASCII() @safe
{
return [Node("ascii string")];
return [
Node("ascii string", "tag:yaml.org,2002:str")
];
}
Node[] constructStr() @safe
{
return [Node([pair("string", "abcd")])];
return [
Node(
[
pair(
Node("string", "tag:yaml.org,2002:str"),
Node("abcd", "tag:yaml.org,2002:str")
)
],
"tag:yaml.org,2002:map")
];
}
Node[] constructStrUTF8() @safe
{
return [Node("\u042d\u0442\u043e \u0443\u043d\u0438\u043a\u043e\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430")];
return [
Node("\u042d\u0442\u043e \u0443\u043d\u0438\u043a\u043e\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430", "tag:yaml.org,2002:str")
];
}
Node[] constructTimestamp() @safe
{
alias DT = DateTime;
alias ST = SysTime;
return [Node([pair("canonical", ST(DT(2001, 12, 15, 2, 59, 43), 1000000.dur!"hnsecs", UTC())),
pair("valid iso8601", ST(DT(2001, 12, 15, 2, 59, 43), 1000000.dur!"hnsecs", UTC())),
pair("space separated", ST(DT(2001, 12, 15, 2, 59, 43), 1000000.dur!"hnsecs", UTC())),
pair("no time zone (Z)", ST(DT(2001, 12, 15, 2, 59, 43), 1000000.dur!"hnsecs", UTC())),
pair("date (00:00:00Z)", ST(DT(2002, 12, 14), UTC()))])];
return [
Node(
[
pair(
Node("canonical", "tag:yaml.org,2002:str"),
Node(SysTime(DateTime(2001, 12, 15, 2, 59, 43), 1000000.dur!"hnsecs", UTC()), "tag:yaml.org,2002:timestamp")
),
pair(
Node("valid iso8601", "tag:yaml.org,2002:str"),
Node(SysTime(DateTime(2001, 12, 15, 2, 59, 43), 1000000.dur!"hnsecs", UTC()), "tag:yaml.org,2002:timestamp")
),
pair(
Node("space separated", "tag:yaml.org,2002:str"),
Node(SysTime(DateTime(2001, 12, 15, 2, 59, 43), 1000000.dur!"hnsecs", UTC()), "tag:yaml.org,2002:timestamp")
),
pair(
Node("no time zone (Z)", "tag:yaml.org,2002:str"),
Node(SysTime(DateTime(2001, 12, 15, 2, 59, 43), 1000000.dur!"hnsecs", UTC()), "tag:yaml.org,2002:timestamp")
),
pair(
Node("date (00:00:00Z)", "tag:yaml.org,2002:str"),
Node(SysTime(DateTime(2002, 12, 14), UTC()), "tag:yaml.org,2002:timestamp")
)
],
"tag:yaml.org,2002:map")
];
}
Node[] constructValue() @safe
{
return[Node([pair("link with",
[Node("library1.dll"), Node("library2.dll")])]),
Node([pair("link with",
[Node([pair("=", "library1.dll"), pair("version", 1.2L)]),
Node([pair("=", "library2.dll"), pair("version", 2.3L)])])])];
return [
Node(
[
pair(
Node("link with", "tag:yaml.org,2002:str"),
Node(
[
Node("library1.dll", "tag:yaml.org,2002:str"),
Node("library2.dll", "tag:yaml.org,2002:str")
],
"tag:yaml.org,2002:seq")
)
],
"tag:yaml.org,2002:map"),
Node(
[
pair(
Node("link with", "tag:yaml.org,2002:str"),
Node(
[
Node(
[
pair(
Node("=", "tag:yaml.org,2002:value"),
Node("library1.dll", "tag:yaml.org,2002:str")
),
pair(
Node("version", "tag:yaml.org,2002:str"),
Node(1.2L, "tag:yaml.org,2002:float")
)
],
"tag:yaml.org,2002:map"),
Node(
[
pair(
Node("=", "tag:yaml.org,2002:value"),
Node("library2.dll", "tag:yaml.org,2002:str")
),
pair(
Node("version", "tag:yaml.org,2002:str"),
Node(2.3L, "tag:yaml.org,2002:float")
)
],
"tag:yaml.org,2002:map")
],
"tag:yaml.org,2002:seq")
)
],
"tag:yaml.org,2002:map")
];
}
Node[] duplicateMergeKey() @safe
{
return [Node([pair("foo", "bar"),
pair("x", 1L),
pair("y", 2L),
pair("z", 3L),
pair("t", 4L)])];
return [
Node(
[
pair(
Node("foo", "tag:yaml.org,2002:str"),
Node("bar", "tag:yaml.org,2002:str")
),
pair(
Node("x", "tag:yaml.org,2002:str"),
Node(1L, "tag:yaml.org,2002:int")
),
pair(
Node("y", "tag:yaml.org,2002:str"),
Node(2L, "tag:yaml.org,2002:int")
),
pair(
Node("z", "tag:yaml.org,2002:str"),
Node(3L, "tag:yaml.org,2002:int")
),
pair(
Node("t", "tag:yaml.org,2002:str"),
Node(4L, "tag:yaml.org,2002:int")
)
],
"tag:yaml.org,2002:map")
];
}
Node[] floatRepresenterBug() @safe
{
return [Node([pair(1.0L, 1L),
pair(real.infinity, 10L),
pair(-real.infinity, -10L),
pair(real.nan, 100L)])];
return [
Node(
[
pair(
Node(1.0L, "tag:yaml.org,2002:float"),
Node(1L, "tag:yaml.org,2002:int")
),
pair(
Node(real.infinity, "tag:yaml.org,2002:float"),
Node(10L, "tag:yaml.org,2002:int")
),
pair(
Node(-real.infinity, "tag:yaml.org,2002:float"),
Node(-10L, "tag:yaml.org,2002:int")
),
pair(
Node(real.nan, "tag:yaml.org,2002:float"),
Node(100L, "tag:yaml.org,2002:int")
)
],
"tag:yaml.org,2002:map")
];
}
Node[] invalidSingleQuoteBug() @safe
{
return [Node([Node("foo \'bar\'"), Node("foo\n\'bar\'")])];
return [
Node(
[
Node("foo \'bar\'", "tag:yaml.org,2002:str"),
Node("foo\n\'bar\'", "tag:yaml.org,2002:str")
],
"tag:yaml.org,2002:seq")
];
}
Node[] moreFloats() @safe
{
return [Node([Node(0.0L),
Node(1.0L),
Node(-1.0L),
Node(real.infinity),
Node(-real.infinity),
Node(real.nan),
Node(real.nan)])];
return [
Node(
[
Node(0.0L, "tag:yaml.org,2002:float"),
Node(1.0L, "tag:yaml.org,2002:float"),
Node(-1.0L, "tag:yaml.org,2002:float"),
Node(real.infinity, "tag:yaml.org,2002:float"),
Node(-real.infinity, "tag:yaml.org,2002:float"),
Node(real.nan, "tag:yaml.org,2002:float"),
Node(real.nan, "tag:yaml.org,2002:float")
],
"tag:yaml.org,2002:seq")
];
}
Node[] negativeFloatBug() @safe
{
return [Node(-1.0L)];
return [
Node(-1.0L, "tag:yaml.org,2002:float")
];
}
Node[] singleDotFloatBug() @safe
{
return [Node(".")];
return [
Node(".", "tag:yaml.org,2002:str")
];
}
Node[] timestampBugs() @safe
{
alias DT = DateTime;
alias ST = SysTime;
alias STZ = immutable SimpleTimeZone;
return [Node([Node(ST(DT(2001, 12, 15, 3, 29, 43), 1000000.dur!"hnsecs", UTC())),
Node(ST(DT(2001, 12, 14, 16, 29, 43), 1000000.dur!"hnsecs", UTC())),
Node(ST(DT(2001, 12, 14, 21, 59, 43), 10100.dur!"hnsecs", UTC())),
Node(ST(DT(2001, 12, 14, 21, 59, 43), new STZ(60.dur!"minutes"))),
Node(ST(DT(2001, 12, 14, 21, 59, 43), new STZ(-90.dur!"minutes"))),
Node(ST(DT(2005, 7, 8, 17, 35, 4), 5176000.dur!"hnsecs", UTC()))])];
return [
Node(
[
Node(SysTime(DateTime(2001, 12, 15, 3, 29, 43), 1000000.dur!"hnsecs", UTC()), "tag:yaml.org,2002:timestamp"),
Node(SysTime(DateTime(2001, 12, 14, 16, 29, 43), 1000000.dur!"hnsecs", UTC()), "tag:yaml.org,2002:timestamp"),
Node(SysTime(DateTime(2001, 12, 14, 21, 59, 43), 10100.dur!"hnsecs", UTC()), "tag:yaml.org,2002:timestamp"),
Node(SysTime(DateTime(2001, 12, 14, 21, 59, 43), new immutable SimpleTimeZone(60.dur!"minutes")), "tag:yaml.org,2002:timestamp"),
Node(SysTime(DateTime(2001, 12, 14, 21, 59, 43), new immutable SimpleTimeZone(-90.dur!"minutes")), "tag:yaml.org,2002:timestamp"),
Node(SysTime(DateTime(2005, 7, 8, 17, 35, 4), 5176000.dur!"hnsecs", UTC()), "tag:yaml.org,2002:timestamp")
],
"tag:yaml.org,2002:seq")
];
}
Node[] utf16be() @safe
{
return [Node("UTF-16-BE")];
return [
Node("UTF-16-BE", "tag:yaml.org,2002:str")
];
}
Node[] utf16le() @safe
{
return [Node("UTF-16-LE")];
return [
Node("UTF-16-LE", "tag:yaml.org,2002:str")
];
}
Node[] utf8() @safe
{
return [Node("UTF-8")];
return [
Node("UTF-8", "tag:yaml.org,2002:str")
];
}
Node[] utf8implicit() @safe
{
return [Node("implicit UTF-8")];
return [
Node("implicit UTF-8", "tag:yaml.org,2002:str")
];
}
///Testing custom YAML class type.
@ -330,10 +879,22 @@ class TestClass
Node opCast(T: Node)() @safe
{
auto pairs = [Node.Pair("x", x),
Node.Pair("y", y),
Node.Pair("z", z)];
return Node(pairs, "!tag1");
return Node(
[
Node.Pair(
Node("x", "tag:yaml.org,2002:str"),
Node(x, "tag:yaml.org,2002:int")
),
Node.Pair(
Node("y", "tag:yaml.org,2002:str"),
Node(y, "tag:yaml.org,2002:int")
),
Node.Pair(
Node("z", "tag:yaml.org,2002:str"),
Node(z, "tag:yaml.org,2002:int")
)
],
"!tag1");
}
}
@ -382,7 +943,7 @@ void testConstructor(string dataFilename, string codeDummy) @safe
size_t i;
foreach(node; loader)
{
if(!node.equals!(No.useTag)(exp[i]))
if(node != exp[i])
{
static if(verbose)
{

View file

@ -65,7 +65,7 @@ void testRepresenterTypes(string codeFilename) @safe
assert(expectedNodes.length == readNodes.length);
foreach(n; 0 .. expectedNodes.length)
{
assert(expectedNodes[n].equals!(No.useTag)(readNodes[n]));
assert(expectedNodes[n] == readNodes[n]);
}
}
}