blob: 33c7f0cf6ee374089d25d224b6d01f2b386350de [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using Microsoft.CodeAnalysis.CSharp;
using NUnit.Framework;
namespace Avro.Test.CodeGen
{
[TestFixture]
class CodeGenTests
{
[Test]
public void TestGetNullableTypeException()
{
Assert.Throws<ArgumentNullException>(() => Avro.CodeGen.GetNullableType(null));
}
[Test]
public void TestReservedKeywords()
{
// https://github.com/dotnet/roslyn/blob/main/src/Compilers/CSharp/Portable/Syntax/SyntaxKindFacts.cs
// Check if all items in CodeGenUtil.Instance.ReservedKeywords are keywords
foreach (string keyword in CodeGenUtil.Instance.ReservedKeywords)
{
Assert.That(SyntaxFacts.GetKeywordKind(keyword) != SyntaxKind.None, Is.True);
}
// Check if all Roslyn defined keywords are in CodeGenUtil.Instance.ReservedKeywords
foreach (SyntaxKind keywordKind in SyntaxFacts.GetReservedKeywordKinds())
{
Assert.That(CodeGenUtil.Instance.ReservedKeywords, Does.Contain(SyntaxFacts.GetText(keywordKind)));
}
// If this test fails, CodeGenUtil.ReservedKeywords list must be updated.
// This might happen if newer version of C# language defines new reserved keywords.
}
[TestCase("a", "a")]
[TestCase("a.b", "a.b")]
[TestCase("a.b.c", "a.b.c")]
[TestCase("int", "@int")]
[TestCase("a.long.b", "a.@long.b")]
[TestCase("int.b.c", "@int.b.c")]
[TestCase("a.b.int", "a.b.@int")]
[TestCase("int.long.while", "@int.@long.@while")] // Reserved keywords
[TestCase("a.value.partial", "a.value.partial")] // Contextual keywords
[TestCase("a.value.b.int.c.while.longpartial", "a.value.b.@int.c.@while.longpartial")] // Reserved and contextual keywords
public void TestMangleUnMangle(string input, string mangled)
{
// Mangle
Assert.That(CodeGenUtil.Instance.Mangle(input), Is.EqualTo(mangled));
// Unmangle
Assert.That(CodeGenUtil.Instance.UnMangle(mangled), Is.EqualTo(input));
}
[TestFixture]
public class CodeGenTestClass : Avro.CodeGen
{
[Test]
public void TestGenerateNamesException()
{
Protocol protocol = null;
Assert.Throws<ArgumentNullException>(() => this.GenerateNames(protocol));
}
[Test]
public void GetTypesShouldReturnTypes()
{
AddSchema(@"
{
""name"": ""PlanetEnum"",
""namespace"": ""Space.Models"",
""type"": ""enum"",
""symbols"": [
""Earth"",
""Mars"",
""Jupiter"",
""Saturn"",
""Uranus"",
""Neptune""
]
}
");
GenerateCode();
var types = GetTypes();
Assert.That(types.Count, Is.EqualTo(1));
bool hasPlanetEnumCode = types.TryGetValue("PlanetEnum", out string planetEnumCode);
Assert.That(hasPlanetEnumCode);
Assert.That(Regex.Matches(planetEnumCode, "public enum PlanetEnum").Count, Is.EqualTo(1));
}
[Test]
public void EnumWithKeywordSymbolsShouldHavePrefixedSymbols()
{
AddSchema(@"{
""type"": ""enum"",
""symbols"": [
""string"",
""integer"",
""float"",
""boolean"",
""list"",
""dict"",
""regex""
],
""name"": ""type"",
""namespace"": ""com.example""
}");
GenerateCode();
var types = GetTypes();
Assert.That(types.Count, Is.EqualTo(1));
bool hasTypeCode = types.TryGetValue("type", out string typeCode);
Assert.That(hasTypeCode);
Assert.That(Regex.Matches(typeCode, "public enum type").Count, Is.EqualTo(1));
Assert.That(Regex.Matches(typeCode, "@string,").Count, Is.EqualTo(1));
Assert.That(Regex.Matches(typeCode, "@float,").Count, Is.EqualTo(1));
}
}
}
}