public void AssertArrayOfChars(MetaArrayOfChars expectedArray, MetaArrayOfChars actualArray)
 {
     Assert.AreEqual(expectedArray.Value, actualArray.Value);
 }
        public MetaStructure ParseStructure(XmlNode node, MetaStructureXml info)
        {
            MetaStructure resultStructure = null;

            foreach (var x in strList)
            {
                if (x.StructureKey == info.Key)
                {
                    resultStructure = new MetaStructure(null, x);
                }
            }
            resultStructure.Values = new Dictionary <int, IMetaValue>();

            foreach (var xmlEntry in info.Entries)
            {
                XmlNode xmlNode = null;
                foreach (XmlNode x in node.ChildNodes)
                {
                    var hash = GetHashForName(x.Name);
                    if (hash == xmlEntry.NameHash)
                    {
                        xmlNode = x;
                    }
                }

                StructureEntryInfo_GTA5_pc entryInfo = null;
                foreach (var x in resultStructure.info.Entries)
                {
                    if (x.EntryNameHash == xmlEntry.NameHash)
                    {
                        entryInfo = x;
                    }
                }

                var type = (StructureEntryDataType)xmlEntry.Type;
                if (type == StructureEntryDataType.Array)
                {
                    var arrayType = (StructureEntryDataType)xmlEntry.ArrayType.Type;
                    if (arrayType == StructureEntryDataType.StructurePointer)
                    {
                        MetaArray arrayValue = ReadPointerArray(xmlNode);
                        arrayValue.info = resultStructure.info.Entries[entryInfo.ReferenceTypeIndex];
                        resultStructure.Values.Add(xmlEntry.NameHash, arrayValue);
                    }
                    if (arrayType == StructureEntryDataType.Structure)
                    {
                        MetaArray arryVal = ReadStructureArray(xmlNode, xmlEntry.ArrayType.TypeHash);
                        arryVal.info = resultStructure.info.Entries[entryInfo.ReferenceTypeIndex];
                        resultStructure.Values.Add(xmlEntry.NameHash, arryVal);
                    }
                    if (arrayType == StructureEntryDataType.UnsignedByte)
                    {
                        MetaArray arryVal = ReadByteArray(xmlNode);
                        arryVal.info = resultStructure.info.Entries[entryInfo.ReferenceTypeIndex];
                        resultStructure.Values.Add(xmlEntry.NameHash, arryVal);
                    }
                    if (arrayType == StructureEntryDataType.UnsignedShort)
                    {
                        MetaArray arryVal = ReadShortArray(xmlNode);
                        arryVal.info = resultStructure.info.Entries[entryInfo.ReferenceTypeIndex];
                        resultStructure.Values.Add(xmlEntry.NameHash, arryVal);
                    }
                    if (arrayType == StructureEntryDataType.UnsignedInt)
                    {
                        MetaArray arryVal = ReadIntArray(xmlNode);
                        arryVal.info = resultStructure.info.Entries[entryInfo.ReferenceTypeIndex];
                        resultStructure.Values.Add(xmlEntry.NameHash, arryVal);
                    }
                    if (arrayType == StructureEntryDataType.Float)
                    {
                        MetaArray arryVal = ReadFloatArray(xmlNode);
                        arryVal.info = resultStructure.info.Entries[entryInfo.ReferenceTypeIndex];
                        resultStructure.Values.Add(xmlEntry.NameHash, arryVal);
                    }
                    if (arrayType == StructureEntryDataType.Float_XYZ)
                    {
                        MetaArray arryVal = ReadFloatVectorArray(xmlNode);
                        arryVal.info = resultStructure.info.Entries[entryInfo.ReferenceTypeIndex];
                        resultStructure.Values.Add(xmlEntry.NameHash, arryVal);
                    }
                    if (arrayType == StructureEntryDataType.Hash)
                    {
                        MetaArray arryVal = ReadHashArray(xmlNode);
                        arryVal.info = resultStructure.info.Entries[entryInfo.ReferenceTypeIndex];
                        resultStructure.Values.Add(xmlEntry.NameHash, arryVal);
                    }
                }


                if (type == StructureEntryDataType.Boolean)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadBoolean(xmlNode));
                }
                if (type == StructureEntryDataType.SignedByte)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadSignedByte(xmlNode));
                }
                if (type == StructureEntryDataType.UnsignedByte)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadUnsignedByte(xmlNode));
                }
                if (type == StructureEntryDataType.SignedShort)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadSignedShort(xmlNode));
                }
                if (type == StructureEntryDataType.UnsignedShort)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadUnsignedShort(xmlNode));
                }
                if (type == StructureEntryDataType.SignedInt)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadSignedInt(xmlNode));
                }
                if (type == StructureEntryDataType.UnsignedInt)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadUnsignedInt(xmlNode));
                }
                if (type == StructureEntryDataType.Float)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadFloat(xmlNode));
                }
                if (type == StructureEntryDataType.Float_XYZ)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadFloatXYZ(xmlNode));
                }
                if (type == StructureEntryDataType.Float_XYZW)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadFloatXYZW(xmlNode));
                }
                if (type == StructureEntryDataType.ByteEnum)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadByteEnum(xmlNode, entryInfo.ReferenceKey));
                }
                if (type == StructureEntryDataType.IntEnum)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadIntEnum(xmlNode, entryInfo.ReferenceKey));
                }
                if (type == StructureEntryDataType.ShortFlags)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadShortFlags(xmlNode, entryInfo.ReferenceKey));
                }
                if (type == StructureEntryDataType.IntFlags1)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadIntFlags1(xmlNode, entryInfo.ReferenceKey));
                }
                if (type == StructureEntryDataType.IntFlags2)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadIntFlags2(xmlNode, entryInfo.ReferenceKey));
                }



                if (type == StructureEntryDataType.ArrayOfBytes)
                {
                    var byteArrayValue = new MetaArrayOfBytes();
                    byteArrayValue.Value = ByteFromString(xmlNode.InnerText);
                    resultStructure.Values.Add(xmlEntry.NameHash, byteArrayValue);
                }
                if (type == StructureEntryDataType.ArrayOfChars)
                {
                    var charArrayValue = new MetaArrayOfChars(entryInfo);
                    charArrayValue.Value = xmlNode.InnerText;
                    resultStructure.Values.Add(xmlEntry.NameHash, charArrayValue);
                }
                if (type == StructureEntryDataType.Hash)
                {
                    var hashValue = new MetaInt32_Hash();
                    if (xmlNode.InnerText.Trim().Length > 0)
                    {
                        hashValue.Value = GetHashForName(xmlNode.InnerText);
                    }
                    resultStructure.Values.Add(xmlEntry.NameHash, hashValue);
                }
                if (type == StructureEntryDataType.CharPointer)
                {
                    var charPointerValue = new MetaCharPointer();
                    charPointerValue.Value = xmlNode.InnerText;
                    if (charPointerValue.Value.Equals(""))
                    {
                        charPointerValue.Value = null;
                    }
                    resultStructure.Values.Add(xmlEntry.NameHash, charPointerValue);
                }
                if (type == StructureEntryDataType.DataBlockPointer)
                {
                    var dataBlockValue = new MetaDataBlockPointer(entryInfo);
                    dataBlockValue.Data = ByteFromString(xmlNode.InnerText);
                    if (dataBlockValue.Data.Length == 0)
                    {
                        dataBlockValue.Data = null;
                    }
                    resultStructure.Values.Add(xmlEntry.NameHash, dataBlockValue);
                }
                if (type == StructureEntryDataType.Structure)
                {
                    var xmlInfo        = FindAndCheckStructure(xmlEntry.TypeHash, xmlNode);
                    var structureValue = ParseStructure(xmlNode, xmlInfo);
                    resultStructure.Values.Add(xmlEntry.NameHash, structureValue);
                }
            }

            return(resultStructure);
        }