BlueM\Tree\Node
 [x] The previous sibling can be retrieved
 [x] Trying to get the previous sibling returns null when called on the first node
 [x] The next sibling can be retrieved
 [x] All siblings can be retrieved
 [x] All siblings can be retrieved including the node itself
 [x] All siblings can be retrieved when mixed data types are used for the ids
 [x] The child nodes can be retrieved
 [x] When trying to get the child nodes an empty array is returned if there are no child nodes
 [x] A node can tell how many children it has
 [x] A node can tell if it has any child nodes
 [x] The parent node can be retrieved
 [x] Trying to get the parent returns null for the root node
 [x] A child can be attached to a node
 [x] The node id can be retrieved
 [x] A node property can be fetched using method get
 [x] Trying to get a non existent property using get throws an exception
 [x] A node property can be fetched using magic method
 [x] Trying to get a non existent property using magic method throws an exception
 [x] The existence of a property can be checked using isset function
 [x] Node properties are handled case insensitively
 [x] The properties can be access using magic properties
 [x] An exception is thrown when accessing an inexistent magic property
 [x] The properties can be fetched as an array
 [x] When serializing a node to json its array representation is used
 [x] In scalar context the node is typecasted to its id
 [x] The level of a root node is 0
 [x] A node 2 levels below the root node has level 2
 [x] The root nodes ancestors is an empty array
 [x] A nodes ancestors can be retrieved
 [x] A nodes ancestors can be retrieved including the node itself
 [x] A nodes descendants can be retrieved
 [x] A nodes descendants can be retrieved including the node itself

BlueM\Tree
 [x] An exception is thrown if a non scalar value should be used as root id
 [x] An exception is thrown if a non string value should be used as id field name
 [x] An exception is thrown if a non string value should be used as parent id field name
 [x] The root nodes can be retrieved
 [x] The root nodes can be retrieved when the ids are strings
 [x] The tree can be rebuilt from new data
 [x] An exception is thrown when trying to create a tree from unusable data
 [x] A tree can be created from an iterable
 [x] A tree can be created from an array of objects implementing iterator
 [x] The tree can be serialized to a json representation from which a tree with the same data can be built when decoded
 [x] All nodes can be retrieved
 [x] All nodes can be retrieved when node ids are strings
 [x] A node can be accessed by its integer id
 [x] A node can be accessed by its string id
 [x] Trying to get a node by its id throws an exception if the id is invalid
 [x] A node can be accessed by its value path
 [x] Trying to get a node by its value path returns null if no node matches
 [x] In scalar context the tree is returned as a string
 [x] An exception is thrown when an invalid parent id is referenced
 [x] An exception is thrown when a node would be its own parent
 [x] An exception is thrown when a node would be its own parent when own id and parent id have different types
 [x] When mixing numeric and string ids no exception is thrown due to implicit typecasting
 [x] Clients can supply differing names for id and parent id in input data

