public void Test()
    {
        const string source           = @"using Liversage.Primitives;

namespace Generated;

[Primitive]
public readonly partial struct A { readonly int value; }
[Primitive]
public readonly partial struct B { readonly int value; }";
        var          inputCompilation = CreateCompilation(source);

        var generator = new PrimitiveGenerator();
        var driver    = CSharpGeneratorDriver.Create(generator).RunGeneratorsAndUpdateCompilation(inputCompilation, out _, out _);
        var runResult = driver.GetRunResult();

        Assert.True(runResult.Diagnostics.IsEmpty);
        Assert.Single(runResult.Results);
        var generatorResult = runResult.Results[0];

        Assert.Equal(generator, generatorResult.Generator);
        Assert.True(generatorResult.Diagnostics.IsEmpty);
        Assert.Null(generatorResult.Exception);
        Assert.Equal(2, generatorResult.GeneratedSources.Length);
        var generatedSourceA = generatorResult.GeneratedSources[0];
        var generatedSourceB = generatorResult.GeneratedSources[1];

        Assert.Equal("A.g.cs", generatedSourceA.HintName);
        Assert.Equal("B.g.cs", generatedSourceB.HintName);
    }
Esempio n. 2
0
    public void Test(string source, string expectedDiagnosticId)
    {
        var inputCompilation = CreateCompilation(source);

        var generator = new PrimitiveGenerator();
        var driver    = CSharpGeneratorDriver.Create(generator).RunGeneratorsAndUpdateCompilation(inputCompilation, out _, out _);
        var runResult = driver.GetRunResult();

        Assert.Single(runResult.Diagnostics);
        var diagnostic = runResult.Diagnostics[0];

        Assert.Equal(expectedDiagnosticId, diagnostic.Id);
    }
Esempio n. 3
0
        public void GenerateIntegerSingle()
        {
            var mockSuit           = new Mock <Suit>();
            var primitiveGenerator = new PrimitiveGenerator(mockSuit.Object);

            mockSuit.Setup(i => i.GeneratePrimitive <int>("test", It.IsAny <ISessionManager>()))
            .Returns(10);

            var result = primitiveGenerator.Integer("test");

            Assert.Equal(10, result);
            mockSuit.Verify(i => i.GeneratePrimitive <int>("test", It.IsAny <ISessionManager>()));
        }
Esempio n. 4
0
        public void GenerateStringSingle()
        {
            var mockSuit           = new Mock <Suit>();
            var primitiveGenerator = new PrimitiveGenerator(mockSuit.Object);

            mockSuit.Setup(i => i.GeneratePrimitive <string>("test", It.IsAny <ISessionManager>()))
            .Returns("Hello");

            var result = primitiveGenerator.String("test");

            Assert.Equal("Hello", result);
            mockSuit.Verify(i => i.GeneratePrimitive <string>("test", It.IsAny <ISessionManager>()));
        }
Esempio n. 5
0
        public void GenerateIntegerList(int times)
        {
            var mockSuit           = new Mock <Suit>();
            var primitiveGenerator = new PrimitiveGenerator(mockSuit.Object);

            mockSuit.Setup(i => i.GeneratePrimitive <int>("test", It.IsAny <ISessionManager>()))
            .Returns(10);

            var result = primitiveGenerator.Integer("test", count: times);

            Assert.All(result,
                       i => Assert.Equal(10, i));

            mockSuit.Verify(i => i.GeneratePrimitive <int>("test", It.IsAny <ISessionManager>()), Times.Exactly(times));
        }
Esempio n. 6
0
        public void GenerateMeshes()
        {
            DistrictMeshes.Clear();
            NeighborhoodMeshes.Clear();
            if (CityConfiguration.DistrictLayer != null && CityConfiguration.DistrictLayer.PolygonIdToDistrictMap != null)
            {
                foreach (var polygon in CityConfiguration.DistrictLayer.PolygonIdToDistrictMap.Keys)
                {
                    Mesh m = PrimitiveGenerator.GeneratePolygon(polygon);
                    DistrictMeshes.Add(m);
                }
            }

            if (CityConfiguration.WardLayer != null && CityConfiguration.WardLayer.PolygonIdToNeighborhoodMap != null)
            {
                foreach (var polygon in CityConfiguration.WardLayer.PolygonIdToNeighborhoodMap.Keys)
                {
                    Mesh m = PrimitiveGenerator.GeneratePolygon(polygon);
                    NeighborhoodMeshes.Add(m);
                }
            }
        }
Esempio n. 7
0
    void PrimitiveSettings()
    {
        using (ShapesUI.Group) {
            GUILayout.Label("Primitives", EditorStyles.boldLabel);
            using (new ShapesUI.AssetEditScope(ShapesAssets.Instance)) {
                if (showDetailLevels = EditorGUILayout.Foldout(showDetailLevels, new GUIContent("Detail Levels", "Configure the mesh density of each detail level preset, for every type of Shape that can make use of it")))
                {
                    using (new EditorGUI.IndentLevelScope(1)) {
                        DrawDetailLevelProperties(sphereDetail, "Sphere", TOOLTIP_DETAIL_SPHERE, min: 1, p => PrimitiveGenerator.TriangleCountIcosphere(p.intValue));
                        DrawDetailLevelProperties(torusDivsMinorMajor, "Torus", TOOLTIP_DETAIL_TORUS, min: 3, p => PrimitiveGenerator.TriangleCountTorus(p.vector2IntValue));
                        DrawDetailLevelProperties(coneDivs, "Cone", TOOLTIP_DETAIL_CONE, min: 3, p => PrimitiveGenerator.TriangleCountCone(p.intValue));
                        DrawDetailLevelProperties(cylinderDivs, "Cylinder", TOOLTIP_DETAIL_CYLINDER, min: 3, p => PrimitiveGenerator.TriangleCountCylinder(p.intValue));
                        DrawDetailLevelProperties(capsuleDivs, "Capsule", TOOLTIP_DETAIL_CAPSULE, min: 1, p => PrimitiveGenerator.TriangleCountCapsule(p.intValue));
                    }
                }

                if (showBounds = EditorGUILayout.Foldout(showBounds, new GUIContent("Bounds Sizes", ShapesConfig.TOOLTIP_BOUNDS)))
                {
                    using (new EditorGUI.IndentLevelScope(1)) {
                        EditorGUILayout.PropertyField(boundsSizeSphere, new GUIContent("Sphere"));
                        EditorGUILayout.PropertyField(boundsSizeTorus, new GUIContent("Torus"));
                        EditorGUILayout.PropertyField(boundsSizeCone, new GUIContent("Cone"));
                        EditorGUILayout.PropertyField(boundsSizeCylinder, new GUIContent("Cylinder"));
                        EditorGUILayout.PropertyField(boundsSizeCapsule, new GUIContent("Capsule"));
                        EditorGUILayout.PropertyField(boundsSizeQuad, new GUIContent("Quad"));
                        EditorGUILayout.PropertyField(boundsSizeTriangle, new GUIContent("Triangle"));
                        EditorGUILayout.PropertyField(boundsSizeCuboid, new GUIContent("Cuboid"));
                    }
                }

                GUILayout.Space(3);
                if (ShapesUI.CenteredButton(new GUIContent("Apply & regenerate primitives", "Regenerate all primitive mesh assets using the configuration above")))
                {
                    PrimitiveGenerator.Generate3DPrimitiveAssets();
                }
                GUILayout.Space(3);
            }
        }
    }
Esempio n. 8
0
    public void Test(string source, string expectedGeneratedFileName, string expectedGeneratedSource)
    {
        var inputCompilation = CreateCompilation(source);

        var generator = new PrimitiveGenerator();
        var driver    = CSharpGeneratorDriver.Create(generator).RunGeneratorsAndUpdateCompilation(inputCompilation, out _, out _);
        var runResult = driver.GetRunResult();

        Assert.True(runResult.Diagnostics.IsEmpty);
        Assert.Single(runResult.Results);
        var generatorResult = runResult.Results[0];

        Assert.Equal(generator, generatorResult.Generator);
        Assert.True(generatorResult.Diagnostics.IsEmpty);
        Assert.Null(generatorResult.Exception);
        Assert.Single(generatorResult.GeneratedSources);
        var generatedSource = generatorResult.GeneratedSources[0];

        Assert.Equal(expectedGeneratedFileName, generatedSource.HintName);
        var generatedSourceText = generatedSource.SourceText.ToString();

        Assert.Equal(expectedGeneratedSource, generatedSourceText);
    }
Esempio n. 9
0
        public string ProcessDefinition(string name)
        {
            var path         = $"./Definitions/{name}.json";
            var lastModified = File.GetLastWriteTime(path);
            var def          = File.ReadAllText(path);
            var tmpl         = _sheetTemplate;

            var sheet = GameData.Excel.GetSheetRaw(name);

            if (sheet == null)
            {
                Console.WriteLine($" - sheet {name} no longer exists!");
                return(null);
            }

            tmpl = tmpl.Replace("%%SHEET_NAME%%", name);
            var hash = sheet.HeaderFile.GetColumnsHash();

            tmpl = tmpl.Replace("%%COL_HASH%%", $"0x{hash:x8}");


            var cols = sheet.Columns;

            var schema = JsonConvert.DeserializeObject <SheetDefinition>(def);

            var generators = new List <BaseShitGenerator>();

            for (uint i = 0; i < cols.Length; i++)
            {
                var column    = cols[i];
                var schemaDef = schema.Definitions.FirstOrDefault(d => d.Index == i);

                var type    = column.Type;
                var clrType = ExcelTypeToManaged(type);

                if (schemaDef == null)
                {
                    var generator = new PrimitiveGenerator(clrType, $"Unknown{i}", i);

                    generators.Add(generator);

                    continue;
                }

                schemaDef.Name = Clean(schemaDef.Name);
                var schemaType = schemaDef.Type;

                // single field
                if (schemaType == null)
                {
                    if (schemaDef.ConverterType == "link" && DefinitionExists(schemaDef.ConverterTarget))
                    {
                        var target = schemaDef.ConverterTarget;

                        generators.Add(new LazyRowGenerator(target, schemaDef.Name, i, cols));
                    }
                    // todo: this is f*****g ass, maybe we can fake a variant though? lol
                    // else if( schemaDef.ConverterType == "complexlink" )
                    // {
                    //     fieldGenerators.Add( new PrimitiveGenerator( clrType, schemaDef.Name, i ) );
                    // }
                    else
                    {
                        // no link/unsupported
                        generators.Add(new PrimitiveGenerator(clrType, schemaDef.Name, i));
                    }
                }
                // repeats
                else if (schemaType == "repeat")
                {
                    // unfuck shit stupid groups with one member which are actually just arrays
                    if (schemaDef.Definition?.Type == "group" && schemaDef.Definition.Members.Count == 1)
                    {
                        schemaDef.Definition.Type = "shitgroup";
                        schemaDef.Name            = Clean(schemaDef.Definition.Members.First().Name);
                    }

                    // todo: groups need their own handling here but it's kind of shit, probably should do this differently
                    if (schemaDef.Definition?.Type == "group")
                    {
                        var memberCount = schemaDef.Definition.Members.Count;

                        string className;
                        string fieldName;
                        if (schemaDef.Definition.GroupName != null)
                        {
                            className = $"{schemaDef.Definition.GroupName}Obj";
                            fieldName = schemaDef.Definition.GroupName;
                        }
                        else
                        {
                            className = $"{name}UnkData{i}Obj";
                            fieldName = $"UnkData{i}";
                        }

                        // todo: add pluralisation to field name? lol
                        generators.Add(
                            new GroupStructGenerator(
                                className,
                                fieldName,
                                i,
                                schemaDef.Definition.Members,
                                schemaDef.Count,
                                cols
                                )
                            );

                        i += (schemaDef.Count * (uint)memberCount) - 1;
                    }
                    else
                    {
                        if (schemaDef.ConverterType == "link" && DefinitionExists(schemaDef.ConverterTarget))
                        {
                            var target = schemaDef.ConverterTarget;
                            generators.Add(new LazyRowRepeatGenerator(target, schemaDef.Name, i, schemaDef.Count, cols));
                        }
                        // todo: this is f****d and i question my sanity if i ever want to actually support this f*****g garbage
                        // else if( schemaDef.ConverterType == "complexlink" )
                        // {
                        //
                        // }
                        else
                        {
                            if (string.IsNullOrEmpty(schemaDef.Name))
                            {
                                schemaDef.Name = $"Unknown{i}";
                            }
                            generators.Add(new PrimitiveRepeatGenerator(clrType, schemaDef.Name, i, schemaDef.Count));
                        }

                        i += schemaDef.Count - 1;
                    }
                }
            }

            var fieldsSb  = new StringBuilder();
            var readsSb   = new StringBuilder();
            var structsSb = new StringBuilder();

            // run the generators
            foreach (var generator in generators)
            {
                generator.WriteFields(fieldsSb);
                // fieldsSb.AppendLine();
                generator.WriteReaders(readsSb);
                // readsSb.AppendLine();
                generator.WriteStructs(structsSb);
            }

            // fix indent the big brain way
            Func <StringBuilder, int, string> fixIndent = (sb, level) =>
            {
                var indent = "";
                for (int i = 0; i < level * 4; i++)
                {
                    indent += " ";
                }

                return(indent + sb.ToString().Replace("\n", $"\n{indent}"));
            };

            tmpl = tmpl.Replace("%%STRUCT_DEFS%%", fixIndent(structsSb, 2));
            tmpl = tmpl.Replace("%%DATA_MEMBERS%%", fixIndent(fieldsSb, 2));
            tmpl = tmpl.Replace("%%DATA_READERS%%", fixIndent(readsSb, 3).TrimEnd());

            return(tmpl);
        }