public void PopulateNode(ValueStore.Node node, System.Random rnd, string basename, int depth)
    {
        var numVariants = rnd.Next(0, maxVariants);
        var numChildren = rnd.Next(0, maxChildren);

        for (int i = 0; i < numVariants; i++)
        {
            var name = basename + "/Variant_" + i;

            var variant = node.AddVariant(name, name + "_Value");

            if (depth < maxDepth)
            {
                PopulateNode(variant, rnd, name, depth + 1);
            }
        }

        for (int i = 0; i < numChildren; i++)
        {
            var name = basename + "/Child_" + i;

            var child = node.AddChild(name, name + "_Value");

            if (depth < maxDepth)
            {
                PopulateNode(child, rnd, name, depth + 1);
            }
        }
    }
    public void PrintRecursive(ValueStore.Node node, int depth, StringBuilder builder)
    {
        var indent = new string('-', depth * 2);

        builder.Append(indent);
        builder.Append(" ");
        builder.Append(node.Name);
        builder.Append(" = ");
        builder.Append(node.Value);
        builder.Append("\n");

        builder.Append(indent);
        builder.Append(" ");
        builder.Append(node.VariantCount);
        builder.Append(" variants:\n");

        foreach (var variant in node.Variants)
        {
            PrintRecursive(variant, depth + 1, builder);
        }

        builder.Append(indent);
        builder.Append(" ");
        builder.Append(node.ChildCount);
        builder.Append(" children:\n");

        foreach (var children in node.Children)
        {
            PrintRecursive(children, depth + 1, builder);
        }
    }
    public void AssertRecursive(ValueStore.Node node1, ValueStore.Node node2)
    {
        Assert.AreEqual(node1.Name, node2.Name);
        Assert.AreEqual(node1.Value, node2.Value);

        Assert.AreEqual(node1.VariantCount, node2.VariantCount);
        foreach (var pair in node1.Variants.IterateWith(node2.Variants))
        {
            AssertRecursive(pair.First, pair.Second);
        }

        Assert.AreEqual(node1.ChildCount, node2.ChildCount);
        foreach (var pair in node1.Children.IterateWith(node2.Children))
        {
            AssertRecursive(pair.First, pair.Second);
        }
    }