public void TestTemplateSizes()
        {
            var table = new TemplateSizes.Table();

            using (StreamReader streamIn = new StreamReader(GetTablePath())) {
                table.Load(streamIn);
            }

            var doneTemplates = new List <string>();

            foreach (var record in table)
            {
                if (!NMSTemplate.NMSTemplateMap.ContainsKey(record.TemplateName))
                {
                    Debug.WriteLine($"TestTemplateSizes: size 0x{record.TemplateSize:X} defined for missing template {record.TemplateName}!");
                    continue;
                }

                int size = NMSTemplate.GetTemplateDataSize(record.TemplateName);
                Assert.AreEqual(record.TemplateSize, size, $"template {record.TemplateName} size 0x{record.TemplateSize:X} != 0x{size:X}");
                doneTemplates.Add(record.TemplateName);
            }

            foreach (var template in NMSTemplate.NMSTemplateMap)
            {
                if (!doneTemplates.Contains(template.Key))
                {
                    Debug.WriteLine($"TestTemplateSizes: no size defined for template {template.Key}!");
                }
            }
        }
        public void GenerateTemplateSizeTable()
        {
            string dataDir = Database.Utils.GetDirectory(libMBIN.Version.NMSVersion);

            var table = new TemplateSizes.Table();

            string logPath = Path.Combine(dataDir, "TemplateSizes.tsv");

            foreach (var type in NMSTemplate.NMSTemplateMap.Values)
            {
                NMSTemplate template = Activator.CreateInstance(type) as NMSTemplate;
                table.Add(new TemplateSizes.Record(type.Name, template.GetDataSize()));
            }

            Utils.SetFileReadOnly(logPath, false);
            using (var streamOut = new StreamWriter(logPath)) {
                streamOut.WriteLine("# Tab-separated values. Open with a spreadsheet app such as Excel.\n");
                streamOut.WriteLine("# READ-ONLY. DO NOT MODIFY OR DELETE.\n");
                table.Save(streamOut);
            }
            Utils.SetFileReadOnly(logPath, true);
        }