Merge pull request #13 from dcronqvist/linting

Add lint step to pull request workflow
This commit is contained in:
dcronqvist 2024-08-24 14:25:37 +02:00 committed by GitHub
commit 3a6684a52d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
42 changed files with 350 additions and 248 deletions

View file

@ -1,11 +1,247 @@
root = true
[*.cs]
#### Core EditorConfig Options ####
charset = utf-8
end_of_line = lf
# Indentation and spacing
indent_size = 2
indent_style = space
# New line preferences
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
#### .NET Coding Conventions ####
dotnet_separate_import_directive_groups = false
dotnet_sort_system_directives_first = true
file_header_template = unset
# this. and Me. preferences
dotnet_style_qualification_for_event = false
dotnet_style_qualification_for_field = false
dotnet_style_qualification_for_method = false
dotnet_style_qualification_for_property = false
# Language keywords vs BCL types preferences
dotnet_style_predefined_type_for_locals_parameters_members = true
dotnet_style_predefined_type_for_member_access = true
# Parentheses preferences
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity
dotnet_style_parentheses_in_other_operators = never_if_unnecessary
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity
# Modifier preferences
dotnet_style_require_accessibility_modifiers = for_non_interface_members
# Expression-level preferences
dotnet_style_coalesce_expression = true
dotnet_style_collection_initializer = false
dotnet_style_explicit_tuple_names = true
dotnet_style_namespace_match_folder = false
dotnet_style_null_propagation = true
dotnet_style_object_initializer = true
dotnet_style_operator_placement_when_wrapping = beginning_of_line
dotnet_style_prefer_auto_properties = true
dotnet_style_prefer_collection_expression = false
dotnet_style_prefer_compound_assignment = true
dotnet_style_prefer_conditional_expression_over_assignment = false
dotnet_style_prefer_conditional_expression_over_return = false
dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed
dotnet_style_prefer_inferred_anonymous_type_member_names = true
dotnet_style_prefer_inferred_tuple_names = true
dotnet_style_prefer_is_null_check_over_reference_equality_method = true
dotnet_style_prefer_simplified_boolean_expressions = true
dotnet_style_prefer_simplified_interpolation = true
# Field preferences
dotnet_style_readonly_field = true
# Parameter preferences
dotnet_code_quality_unused_parameters = all:silent
# Suppression preferences
dotnet_remove_unnecessary_suppression_exclusions = none
# New line preferences
dotnet_style_allow_multiple_blank_lines_experimental = true
dotnet_style_allow_statement_immediately_after_block_experimental = true
#### C# Coding Conventions ####
# var preferences
csharp_style_var_elsewhere = false
csharp_style_var_for_built_in_types = false
csharp_style_var_when_type_is_apparent = false
# Expression-bodied members
csharp_style_expression_bodied_accessors = true
csharp_style_expression_bodied_constructors = false
csharp_style_expression_bodied_indexers = true
csharp_style_expression_bodied_lambdas = true
csharp_style_expression_bodied_local_functions = false
csharp_style_expression_bodied_methods = when_on_single_line
csharp_style_expression_bodied_operators = false
csharp_style_expression_bodied_properties = true
# Pattern matching preferences
csharp_style_pattern_matching_over_as_with_null_check = true
csharp_style_pattern_matching_over_is_with_cast_check = true
csharp_style_prefer_extended_property_pattern = true
csharp_style_prefer_not_pattern = true
csharp_style_prefer_pattern_matching = true
csharp_style_prefer_switch_expression = true
# Null-checking preferences
csharp_style_conditional_delegate_call = true
# Modifier preferences
csharp_prefer_static_local_function = true
csharp_preferred_modifier_order = public,private,protected,internal,file,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,required,volatile,async
csharp_style_prefer_readonly_struct = true
csharp_style_prefer_readonly_struct_member = true
# Code-block preferences
csharp_prefer_braces = when_multiline
csharp_prefer_simple_using_statement = true
csharp_style_namespace_declarations = block_scoped
csharp_style_prefer_method_group_conversion = true
csharp_style_prefer_primary_constructors = false
csharp_style_prefer_top_level_statements = true
# Expression-level preferences
csharp_prefer_simple_default_expression = true
csharp_style_deconstructed_variable_declaration = true
csharp_style_implicit_object_creation_when_type_is_apparent = false
csharp_style_inlined_variable_declaration = true
csharp_style_prefer_index_operator = true
csharp_style_prefer_local_over_anonymous_function = true
csharp_style_prefer_null_check_over_type_check = true
csharp_style_prefer_range_operator = true
csharp_style_prefer_tuple_swap = true
csharp_style_prefer_utf8_string_literals = true
csharp_style_throw_expression = true
csharp_style_unused_value_assignment_preference = discard_variable
csharp_style_unused_value_expression_statement_preference = discard_variable
# 'using' directive preferences
csharp_using_directive_placement = outside_namespace
# New line preferences
csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true
csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true
csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true
csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true
csharp_style_allow_embedded_statements_on_same_line_experimental = true
#### C# Formatting Rules ####
# New line preferences
csharp_new_line_before_catch = true
csharp_new_line_before_else = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_before_members_in_object_initializers = false
csharp_new_line_before_open_brace = all
csharp_new_line_between_query_expression_clauses = true
# Indentation preferences
csharp_indent_block_contents = true
csharp_indent_braces = false
csharp_indent_case_contents = true
csharp_indent_case_contents_when_block = true
csharp_indent_labels = one_less_than_current
csharp_indent_switch_labels = true
# Space preferences
csharp_space_after_cast = false
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_after_comma = true
csharp_space_after_dot = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_after_semicolon_in_for_statement = true
csharp_space_around_binary_operators = before_and_after
csharp_space_around_declaration_statements = false
csharp_space_before_colon_in_inheritance_clause = true
csharp_space_before_comma = false
csharp_space_before_dot = false
csharp_space_before_open_square_brackets = false
csharp_space_before_semicolon_in_for_statement = false
csharp_space_between_empty_square_brackets = false
csharp_space_between_method_call_empty_parameter_list_parentheses = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
csharp_space_between_method_declaration_name_and_open_parenthesis = false
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_parentheses = false
csharp_space_between_square_brackets = false
# Wrapping preferences
csharp_preserve_single_line_blocks = true
csharp_preserve_single_line_statements = true
#### Naming styles ####
# Naming rules
dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
# Symbol specifications
dotnet_naming_symbols.interface.applicable_kinds = interface
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.interface.required_modifiers =
dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.types.required_modifiers =
dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.non_field_members.required_modifiers =
# Naming styles
dotnet_naming_style.pascal_case.required_prefix =
dotnet_naming_style.pascal_case.required_suffix =
dotnet_naming_style.pascal_case.word_separator =
dotnet_naming_style.pascal_case.capitalization = pascal_case
dotnet_naming_style.begins_with_i.required_prefix = I
dotnet_naming_style.begins_with_i.required_suffix =
dotnet_naming_style.begins_with_i.word_separator =
dotnet_naming_style.begins_with_i.capitalization = pascal_case
# Diagnostics
dotnet_analyzer_diagnostic.severity = warning
dotnet_diagnostic.IDE0001.severity = none
dotnet_diagnostic.IDE0004.severity = silent
dotnet_diagnostic.IDE0005.severity = error
dotnet_diagnostic.IDE0008.severity = silent
dotnet_diagnostic.IDE0055.severity = silent
dotnet_diagnostic.IDE0160.severity = none
dotnet_diagnostic.CA1707.severity = silent
dotnet_diagnostic.CA1852.severity = none
dotnet_diagnostic.CA1805.severity = none
dotnet_diagnostic.CA1720.severity = silent
dotnet_diagnostic.CA1711.severity = silent
dotnet_diagnostic.CA1716.severity = silent
[.github/**/*.yml]
charset = utf-8

View file

@ -5,7 +5,7 @@ on:
- dev
jobs:
tests:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
@ -19,4 +19,7 @@ jobs:
run: dotnet build --no-restore src/DotTiled.sln
- name: Test
run: dotnet test --no-build --verbosity normal src/DotTiled.sln
- name: Lint style
run: dotnet format style --verify-no-changes --verbosity diagnostic src/DotTiled.sln
- name: Lint analyzers
run: dotnet format analyzers --verify-no-changes --verbosity diagnostic src/DotTiled.sln

View file

@ -1,18 +1,22 @@
test:
dotnet build src/DotTiled.sln
dotnet test src/DotTiled.sln
docs-serve:
docfx docs/docfx.json --serve
docs-build:
cp README.md docs/index.md
docfx docs/docfx.json
BENCHMARK_SOURCES = DotTiled.Benchmark/Program.cs DotTiled.Benchmark/DotTiled.Benchmark.csproj
BENCHMARK_OUTPUTDIR = DotTiled.Benchmark/BenchmarkDotNet.Artifacts
.PHONY: benchmark
benchmark: $(BENCHMARK_OUTPUTDIR)/results/MyBenchmarks.MapLoading-report-github.md
$(BENCHMARK_OUTPUTDIR)/results/MyBenchmarks.MapLoading-report-github.md: $(BENCHMARK_SOURCES)
test:
dotnet build src/DotTiled.sln
dotnet test src/DotTiled.sln
docs-serve:
docfx docs/docfx.json --serve
docs-build:
cp README.md docs/index.md
docfx docs/docfx.json
lint:
dotnet format style --verify-no-changes src/DotTiled.sln
dotnet format analyzers --verify-no-changes src/DotTiled.sln
BENCHMARK_SOURCES = DotTiled.Benchmark/Program.cs DotTiled.Benchmark/DotTiled.Benchmark.csproj
BENCHMARK_OUTPUTDIR = DotTiled.Benchmark/BenchmarkDotNet.Artifacts
.PHONY: benchmark
benchmark: $(BENCHMARK_OUTPUTDIR)/results/MyBenchmarks.MapLoading-report-github.md
$(BENCHMARK_OUTPUTDIR)/results/MyBenchmarks.MapLoading-report-github.md: $(BENCHMARK_SOURCES)
dotnet run --project DotTiled.Benchmark/DotTiled.Benchmark.csproj -c Release -- $(BENCHMARK_OUTPUTDIR)

View file

@ -1,17 +1,13 @@
using System;
using System.Collections.Immutable;
using System.Runtime.CompilerServices;
using System.Security.Cryptography;
using System.Text;
using System.Xml;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Columns;
using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Order;
using BenchmarkDotNet.Reports;
using BenchmarkDotNet.Running;
namespace MyBenchmarks
namespace DotTiled.Benchmark
{
[GroupBenchmarksBy(BenchmarkLogicalGroupRule.ByCategory)]
[CategoriesColumn]
@ -19,11 +15,11 @@ namespace MyBenchmarks
[HideColumns(["StdDev", "Error", "RatioSD"])]
public class MapLoading
{
private string _tmxPath = @"DotTiled.Tests/Serialization/TestData/Map/default-map/default-map.tmx";
private string _tmxContents = "";
private readonly string _tmxPath = @"DotTiled.Tests/Serialization/TestData/Map/default-map/default-map.tmx";
private readonly string _tmxContents = "";
private string _tmjPath = @"DotTiled.Tests/Serialization/TestData/Map/default-map/default-map.tmj";
private string _tmjContents = "";
private readonly string _tmjPath = @"DotTiled.Tests/Serialization/TestData/Map/default-map/default-map.tmj";
private readonly string _tmjContents = "";
public MapLoading()
{
@ -31,11 +27,11 @@ namespace MyBenchmarks
var tmxPath = Path.Combine(basePath, $"../{_tmxPath}");
var tmjPath = Path.Combine(basePath, $"../{_tmjPath}");
_tmxContents = System.IO.File.ReadAllText(tmxPath);
_tmjContents = System.IO.File.ReadAllText(tmjPath);
_tmxContents = File.ReadAllText(tmxPath);
_tmjContents = File.ReadAllText(tmjPath);
}
static string WhereAmI([CallerFilePath] string callerFilePath = "") => callerFilePath;
private static string WhereAmI([CallerFilePath] string callerFilePath = "") => callerFilePath;
[BenchmarkCategory("MapFromInMemoryTmxString")]
[Benchmark(Baseline = true, Description = "DotTiled")]
@ -43,7 +39,7 @@ namespace MyBenchmarks
{
using var stringReader = new StringReader(_tmxContents);
using var xmlReader = XmlReader.Create(stringReader);
using var mapReader = new DotTiled.Serialization.Tmx.TmxMapReader(xmlReader, _ => throw new Exception(), _ => throw new Exception(), []);
using var mapReader = new DotTiled.Serialization.Tmx.TmxMapReader(xmlReader, _ => throw new NotSupportedException(), _ => throw new NotSupportedException(), []);
return mapReader.ReadMap();
}
@ -51,7 +47,7 @@ namespace MyBenchmarks
[Benchmark(Baseline = true, Description = "DotTiled")]
public DotTiled.Model.Map LoadWithDotTiledFromInMemoryTmjString()
{
using var mapReader = new DotTiled.Serialization.Tmj.TmjMapReader(_tmjContents, _ => throw new Exception(), _ => throw new Exception(), []);
using var mapReader = new DotTiled.Serialization.Tmj.TmjMapReader(_tmjContents, _ => throw new NotSupportedException(), _ => throw new NotSupportedException(), []);
return mapReader.ReadMap();
}
@ -84,11 +80,11 @@ namespace MyBenchmarks
{
public static void Main(string[] args)
{
var config = BenchmarkDotNet.Configs.DefaultConfig.Instance
var config = DefaultConfig.Instance
.WithArtifactsPath(args[0])
.WithOptions(ConfigOptions.DisableOptimizationsValidator)
.AddDiagnoser(BenchmarkDotNet.Diagnosers.MemoryDiagnoser.Default);
var summary = BenchmarkRunner.Run<MapLoading>(config);
_ = BenchmarkRunner.Run<MapLoading>(config);
}
}
}

View file

@ -24,30 +24,15 @@ public static partial class DotTiledAssert
AssertObject((dynamic)expected, (dynamic)actual);
}
private static void AssertObject(RectangleObject expected, RectangleObject actual)
{
Assert.True(true); // A rectangle object is the same as the abstract Object
}
private static void AssertObject(RectangleObject _, RectangleObject __) => Assert.True(true); // A rectangle object is the same as the abstract Object
private static void AssertObject(EllipseObject expected, EllipseObject actual)
{
Assert.True(true); // An ellipse object is the same as the abstract Object
}
private static void AssertObject(EllipseObject _, EllipseObject __) => Assert.True(true); // An ellipse object is the same as the abstract Object
private static void AssertObject(PointObject expected, PointObject actual)
{
Assert.True(true); // A point object is the same as the abstract Object
}
private static void AssertObject(PointObject _, PointObject __) => Assert.True(true); // A point object is the same as the abstract Object
private static void AssertObject(PolygonObject expected, PolygonObject actual)
{
AssertEqual(expected.Points, actual.Points, nameof(PolygonObject.Points));
}
private static void AssertObject(PolygonObject expected, PolygonObject actual) => AssertEqual(expected.Points, actual.Points, nameof(PolygonObject.Points));
private static void AssertObject(PolylineObject expected, PolylineObject actual)
{
AssertEqual(expected.Points, actual.Points, nameof(PolylineObject.Points));
}
private static void AssertObject(PolylineObject expected, PolylineObject actual) => AssertEqual(expected.Points, actual.Points, nameof(PolylineObject.Points));
private static void AssertObject(TextObject expected, TextObject actual)
{
@ -67,9 +52,5 @@ public static partial class DotTiledAssert
AssertEqual(expected.Text, actual.Text, nameof(TextObject.Text));
}
private static void AssertObject(TileObject expected, TileObject actual)
{
// Attributes
AssertEqual(expected.GID, actual.GID, nameof(TileObject.GID));
}
private static void AssertObject(TileObject expected, TileObject actual) => AssertEqual(expected.GID, actual.GID, nameof(TileObject.GID));
}

View file

@ -28,40 +28,19 @@ public static partial class DotTiledAssert
AssertProperties((dynamic)actual, (dynamic)expected);
}
private static void AssertProperty(StringProperty expected, StringProperty actual)
{
AssertEqual(expected.Value, actual.Value, "StringProperty.Value");
}
private static void AssertProperty(StringProperty expected, StringProperty actual) => AssertEqual(expected.Value, actual.Value, "StringProperty.Value");
private static void AssertProperty(IntProperty expected, IntProperty actual)
{
AssertEqual(expected.Value, actual.Value, "IntProperty.Value");
}
private static void AssertProperty(IntProperty expected, IntProperty actual) => AssertEqual(expected.Value, actual.Value, "IntProperty.Value");
private static void AssertProperty(FloatProperty expected, FloatProperty actual)
{
AssertEqual(expected.Value, actual.Value, "FloatProperty.Value");
}
private static void AssertProperty(FloatProperty expected, FloatProperty actual) => AssertEqual(expected.Value, actual.Value, "FloatProperty.Value");
private static void AssertProperty(BoolProperty expected, BoolProperty actual)
{
AssertEqual(expected.Value, actual.Value, "BoolProperty.Value");
}
private static void AssertProperty(BoolProperty expected, BoolProperty actual) => AssertEqual(expected.Value, actual.Value, "BoolProperty.Value");
private static void AssertProperty(ColorProperty expected, ColorProperty actual)
{
AssertEqual(expected.Value, actual.Value, "ColorProperty.Value");
}
private static void AssertProperty(ColorProperty expected, ColorProperty actual) => AssertEqual(expected.Value, actual.Value, "ColorProperty.Value");
private static void AssertProperty(FileProperty expected, FileProperty actual)
{
AssertEqual(expected.Value, actual.Value, "FileProperty.Value");
}
private static void AssertProperty(FileProperty expected, FileProperty actual) => AssertEqual(expected.Value, actual.Value, "FileProperty.Value");
private static void AssertProperty(ObjectProperty expected, ObjectProperty actual)
{
AssertEqual(expected.Value, actual.Value, "ObjectProperty.Value");
}
private static void AssertProperty(ObjectProperty expected, ObjectProperty actual) => AssertEqual(expected.Value, actual.Value, "ObjectProperty.Value");
private static void AssertProperty(ClassProperty expected, ClassProperty actual)
{

View file

@ -1,5 +1,4 @@
using DotTiled.Model;
using DotTiled.Model;
namespace DotTiled.Tests;

View file

@ -1,6 +1,5 @@
using System.Xml;
using DotTiled.Model;
using DotTiled.Model;
namespace DotTiled.Tests;
@ -33,49 +32,14 @@ public static partial class TestData
public static IEnumerable<object[]> MapTests =>
[
["Serialization/TestData/Map/default_map/default-map", (string f) => TestData.DefaultMap(), Array.Empty<CustomTypeDefinition>()],
["Serialization/TestData/Map/map_with_common_props/map-with-common-props", (string f) => TestData.MapWithCommonProps(), Array.Empty<CustomTypeDefinition>()],
["Serialization/TestData/Map/map_with_custom_type_props/map-with-custom-type-props", (string f) => TestData.MapWithCustomTypeProps(), TestData.MapWithCustomTypePropsCustomTypeDefinitions()],
["Serialization/TestData/Map/map_with_embedded_tileset/map-with-embedded-tileset", (string f) => TestData.MapWithEmbeddedTileset(), Array.Empty<CustomTypeDefinition>()],
["Serialization/TestData/Map/map_with_external_tileset/map-with-external-tileset", (string f) => TestData.MapWithExternalTileset(f), Array.Empty<CustomTypeDefinition>()],
["Serialization/TestData/Map/map_with_flippingflags/map-with-flippingflags", (string f) => TestData.MapWithFlippingFlags(f), Array.Empty<CustomTypeDefinition>()],
["Serialization/TestData/Map/map_external_tileset_multi/map-external-tileset-multi", (string f) => TestData.MapExternalTilesetMulti(f), Array.Empty<CustomTypeDefinition>()],
["Serialization/TestData/Map/map_external_tileset_wangset/map-external-tileset-wangset", (string f) => TestData.MapExternalTilesetWangset(f), Array.Empty<CustomTypeDefinition>()],
["Serialization/TestData/Map/map_with_many_layers/map-with-many-layers", (string f) => TestData.MapWithManyLayers(f), Array.Empty<CustomTypeDefinition>()],
];
private static CustomTypeDefinition[] typedefs = [
new CustomClassDefinition
{
Name = "TestClass",
ID = 1,
UseAs = CustomClassUseAs.Property,
Members = [
new StringProperty
{
Name = "Name",
Value = ""
},
new FloatProperty
{
Name = "Amount",
Value = 0f
}
]
},
new CustomClassDefinition
{
Name = "Test",
ID = 2,
UseAs = CustomClassUseAs.All,
Members = [
new ClassProperty
{
Name = "Yep",
PropertyType = "TestClass",
Properties = []
}
]
}
["Serialization/TestData/Map/default_map/default-map", (string f) => DefaultMap(), Array.Empty<CustomTypeDefinition>()],
["Serialization/TestData/Map/map_with_common_props/map-with-common-props", (string f) => MapWithCommonProps(), Array.Empty<CustomTypeDefinition>()],
["Serialization/TestData/Map/map_with_custom_type_props/map-with-custom-type-props", (string f) => MapWithCustomTypeProps(), MapWithCustomTypePropsCustomTypeDefinitions()],
["Serialization/TestData/Map/map_with_embedded_tileset/map-with-embedded-tileset", (string f) => MapWithEmbeddedTileset(), Array.Empty<CustomTypeDefinition>()],
["Serialization/TestData/Map/map_with_external_tileset/map-with-external-tileset", (string f) => MapWithExternalTileset(f), Array.Empty<CustomTypeDefinition>()],
["Serialization/TestData/Map/map_with_flippingflags/map-with-flippingflags", (string f) => MapWithFlippingFlags(f), Array.Empty<CustomTypeDefinition>()],
["Serialization/TestData/Map/map_external_tileset_multi/map-external-tileset-multi", (string f) => MapExternalTilesetMulti(f), Array.Empty<CustomTypeDefinition>()],
["Serialization/TestData/Map/map_external_tileset_wangset/map-external-tileset-wangset", (string f) => MapExternalTilesetWangset(f), Array.Empty<CustomTypeDefinition>()],
["Serialization/TestData/Map/map_with_many_layers/map-with-many-layers", (string f) => MapWithManyLayers(f), Array.Empty<CustomTypeDefinition>()],
];
}

View file

@ -1,5 +1,4 @@
using DotTiled.Model;
using DotTiled.Model;
namespace DotTiled.Tests;

View file

@ -1,8 +1,5 @@
using System.Globalization;
using DotTiled.Model;
using DotTiled.Model;
using DotTiled.Model;
using DotTiled.Model;
namespace DotTiled.Tests;

View file

@ -1,7 +1,5 @@
using System.Globalization;
using DotTiled.Model;
using DotTiled.Model;
using DotTiled.Model;
namespace DotTiled.Tests;

View file

@ -1,7 +1,5 @@
using System.Globalization;
using DotTiled.Model;
using DotTiled.Model;
using DotTiled.Model;
namespace DotTiled.Tests;

View file

@ -1,8 +1,5 @@
using System.Globalization;
using DotTiled.Model;
using DotTiled.Model;
using DotTiled.Model;
using DotTiled.Model;
namespace DotTiled.Tests;

View file

@ -1,7 +1,5 @@
using System.Globalization;
using DotTiled.Model;
using DotTiled.Model;
using DotTiled.Model;
namespace DotTiled.Tests;

View file

@ -1,7 +1,5 @@
using System.Globalization;
using DotTiled.Model;
using DotTiled.Model;
using DotTiled.Model;
namespace DotTiled.Tests;

View file

@ -1,7 +1,5 @@
using System.Globalization;
using DotTiled.Model;
using DotTiled.Model;
using DotTiled.Model;
namespace DotTiled.Tests;

View file

@ -1,9 +1,5 @@
using System.Numerics;
using DotTiled.Model;
using DotTiled.Model;
using DotTiled.Model;
using DotTiled.Model;
using DotTiled.Model;
namespace DotTiled.Tests;

View file

@ -1,6 +1,4 @@
using DotTiled.Model;
using DotTiled.Model;
using DotTiled.Model;
using DotTiled.Serialization.Tmj;
namespace DotTiled.Tests;

View file

@ -1,6 +1,3 @@
using System.Xml;
using DotTiled.Model;
using DotTiled.Model;
using DotTiled.Model;
using DotTiled.Serialization.Tmx;

View file

@ -1,7 +1,6 @@
using System;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Threading;
namespace DotTiled.Model;
@ -40,7 +39,7 @@ public class Color : IParsable<Color>, IEquatable<Color>
/// <exception cref="FormatException">Thrown in case the provided string <paramref name="s"/> is not in a valid format.</exception>
public static Color Parse(string s, IFormatProvider? provider)
{
TryParse(s, provider, out var result);
_ = TryParse(s, provider, out var result);
return result ?? throw new FormatException($"Invalid format for TiledColor: {s}");
}
@ -61,7 +60,7 @@ public class Color : IParsable<Color>, IEquatable<Color>
return TryParse($"#{s}", provider, out result);
// Format: #RRGGBB or #AARRGGBB
if (s is null || s.Length != 7 && s.Length != 9 || s[0] != '#')
if (s is null || (s.Length != 7 && s.Length != 9) || s[0] != '#')
{
result = default;
return false;

View file

@ -4,8 +4,6 @@ using System.IO;
using System.IO.Compression;
using System.Linq;
using DotTiled.Model;
using DotTiled.Model;
using DotTiled.Model;
namespace DotTiled.Serialization;

View file

@ -1,9 +1,5 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Text.Json;
using DotTiled.Model;
@ -69,7 +65,8 @@ internal partial class Tmj
{
DataCompression.GZip => Helpers.DecompressGZip(stream),
DataCompression.ZLib => Helpers.DecompressZLib(stream),
_ => throw new JsonException($"Unsupported compression '{compression}'.")
DataCompression.ZStd => throw new NotSupportedException("ZStd compression is not supported."),
_ => throw new InvalidOperationException($"Unsupported compression '{compression}'.")
};
{

View file

@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Numerics;
using System.Text.Json;
using DotTiled.Model;

View file

@ -1,10 +1,7 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Numerics;
using System.Text.Json;
using DotTiled.Model;
using DotTiled.Model;
namespace DotTiled.Serialization.Tmj;

View file

@ -1,7 +1,5 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Numerics;
using System.Text.Json;
using DotTiled.Model;

View file

@ -1,8 +1,6 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text.Json;
using DotTiled.Model;

View file

@ -112,8 +112,8 @@ internal partial class Tmj
var id = element.GetOptionalProperty<uint?>("id", idDefault);
var name = element.GetOptionalProperty<string>("name", nameDefault);
var point = element.GetOptionalProperty<bool>("point", pointDefault);
var polygon = element.GetOptionalPropertyCustom<List<Vector2>?>("polygon", e => ReadPoints(e), polygonDefault);
var polyline = element.GetOptionalPropertyCustom<List<Vector2>?>("polyline", e => ReadPoints(e), polylineDefault);
var polygon = element.GetOptionalPropertyCustom<List<Vector2>?>("polygon", ReadPoints, polygonDefault);
var polyline = element.GetOptionalPropertyCustom<List<Vector2>?>("polyline", ReadPoints, polylineDefault);
var properties = element.GetOptionalPropertyCustom<Dictionary<string, IProperty>?>("properties", e => ReadProperties(e, customTypeDefinitions), propertiesDefault);
var rotation = element.GetOptionalProperty<float>("rotation", rotationDefault);
var text = element.GetOptionalPropertyCustom<TextObject?>("text", ReadText, null);
@ -249,12 +249,12 @@ internal partial class Tmj
}
internal static List<Vector2> ReadPoints(JsonElement element) =>
element.GetValueAsList<Vector2>(e =>
{
var x = e.GetRequiredProperty<float>("x");
var y = e.GetRequiredProperty<float>("y");
return new Vector2(x, y);
});
element.GetValueAsList<Vector2>(e =>
{
var x = e.GetRequiredProperty<float>("x");
var y = e.GetRequiredProperty<float>("y");
return new Vector2(x, y);
});
internal static TextObject ReadText(JsonElement element)
{

View file

@ -1,6 +1,5 @@
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text.Json;
using DotTiled.Model;
@ -102,8 +101,6 @@ internal partial class Tmj
return resultingProps;
}
internal static Dictionary<string, IProperty> CreateInstanceOfCustomClass(CustomClassDefinition customClassDefinition)
{
return customClassDefinition.Members.ToDictionary(m => m.Name, m => m.Clone());
}
internal static Dictionary<string, IProperty> CreateInstanceOfCustomClass(CustomClassDefinition customClassDefinition) =>
customClassDefinition.Members.ToDictionary(m => m.Name, m => m.Clone());
}

View file

@ -1,7 +1,5 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Numerics;
using System.Text.Json;
using DotTiled.Model;

View file

@ -1,7 +1,5 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Numerics;
using System.Text.Json;
using DotTiled.Model;

View file

@ -1,9 +1,6 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Text.Json;
using DotTiled.Model;

View file

@ -1,7 +1,5 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.Json;
using DotTiled.Model;
@ -16,7 +14,7 @@ public class TmjMapReader : IMapReader
private readonly Func<string, Tileset> _externalTilesetResolver;
private readonly Func<string, Template> _externalTemplateResolver;
private string _jsonString;
private readonly string _jsonString;
private bool disposedValue;
private readonly IReadOnlyCollection<CustomTypeDefinition> _customTypeDefinitions;
@ -77,6 +75,6 @@ public class TmjMapReader : IMapReader
{
// Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
Dispose(disposing: true);
System.GC.SuppressFinalize(this);
GC.SuppressFinalize(this);
}
}

View file

@ -74,6 +74,6 @@ public class TsjTilesetReader : ITilesetReader
{
// Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
Dispose(disposing: true);
System.GC.SuppressFinalize(this);
GC.SuppressFinalize(this);
}
}

View file

@ -31,10 +31,8 @@ internal static class ExtensionsXmlReader
return enumParser(value);
}
internal static string? GetOptionalAttribute(this XmlReader reader, string attribute, string? defaultValue = default)
{
return reader.GetAttribute(attribute) ?? defaultValue;
}
internal static string? GetOptionalAttribute(this XmlReader reader, string attribute, string? defaultValue = default) =>
reader.GetAttribute(attribute) ?? defaultValue;
internal static T? GetOptionalAttributeParseable<T>(this XmlReader reader, string attribute) where T : struct, IParsable<T>
{
@ -84,7 +82,7 @@ internal static class ExtensionsXmlReader
if (reader.NodeType == XmlNodeType.EndElement)
continue; // At end of list, no need to read again
reader.Read();
_ = reader.Read();
}
reader.ReadEndElement();
@ -135,6 +133,6 @@ internal static class ExtensionsXmlReader
internal static void SkipXmlDeclaration(this XmlReader reader)
{
if (reader.NodeType == XmlNodeType.XmlDeclaration)
reader.Read();
_ = reader.Read();
}
}

View file

@ -62,10 +62,8 @@ internal partial class Tmx
return (clearedGlobalTileIDs, flippingFlags);
}
internal static uint[] ReadTileChildrenInWrapper(string wrapper, XmlReader reader)
{
return reader.ReadList(wrapper, "tile", (r) => r.GetOptionalAttributeParseable<uint>("gid") ?? 0).ToArray();
}
internal static uint[] ReadTileChildrenInWrapper(string wrapper, XmlReader reader) =>
reader.ReadList(wrapper, "tile", (r) => r.GetOptionalAttributeParseable<uint>("gid") ?? 0).ToArray();
internal static uint[] ReadRawData(XmlReader reader, DataEncoding encoding, DataCompression? compression)
{

View file

@ -25,7 +25,7 @@ internal partial class Tmx
"isometric" => MapOrientation.Isometric,
"staggered" => MapOrientation.Staggered,
"hexagonal" => MapOrientation.Hexagonal,
_ => throw new Exception($"Unknown orientation '{s}'")
_ => throw new InvalidOperationException($"Unknown orientation '{s}'")
});
var renderOrder = reader.GetOptionalAttributeEnum<RenderOrder>("renderorder", s => s switch
{
@ -33,7 +33,7 @@ internal partial class Tmx
"right-up" => RenderOrder.RightUp,
"left-down" => RenderOrder.LeftDown,
"left-up" => RenderOrder.LeftUp,
_ => throw new Exception($"Unknown render order '{s}'")
_ => throw new InvalidOperationException($"Unknown render order '{s}'")
}) ?? RenderOrder.RightDown;
var compressionLevel = reader.GetOptionalAttributeParseable<int>("compressionlevel") ?? -1;
var width = reader.GetRequiredAttributeParseable<uint>("width");
@ -45,13 +45,13 @@ internal partial class Tmx
{
"x" => StaggerAxis.X,
"y" => StaggerAxis.Y,
_ => throw new Exception($"Unknown stagger axis '{s}'")
_ => throw new InvalidOperationException($"Unknown stagger axis '{s}'")
});
var staggerIndex = reader.GetOptionalAttributeEnum<StaggerIndex>("staggerindex", s => s switch
{
"odd" => StaggerIndex.Odd,
"even" => StaggerIndex.Even,
_ => throw new Exception($"Unknown stagger index '{s}'")
_ => throw new InvalidOperationException($"Unknown stagger index '{s}'")
});
var parallaxOriginX = reader.GetOptionalAttributeParseable<float>("parallaxoriginx") ?? 0.0f;
var parallaxOriginY = reader.GetOptionalAttributeParseable<float>("parallaxoriginy") ?? 0.0f;

View file

@ -35,7 +35,7 @@ internal partial class Tmx
{
"topdown" => DrawOrder.TopDown,
"index" => DrawOrder.Index,
_ => throw new Exception($"Unknown draw order '{s}'")
_ => throw new InvalidOperationException($"Unknown draw order '{s}'")
}) ?? DrawOrder.TopDown;
// Elements
@ -119,7 +119,7 @@ internal partial class Tmx
"polygon" => () => Helpers.SetAtMostOnce(ref foundObject, ReadPolygonObject(r), "Object marker"),
"polyline" => () => Helpers.SetAtMostOnce(ref foundObject, ReadPolylineObject(r), "Object marker"),
"text" => () => Helpers.SetAtMostOnce(ref foundObject, ReadTextObject(r), "Object marker"),
_ => throw new Exception($"Unknown object marker '{elementName}'")
_ => throw new InvalidOperationException($"Unknown object marker '{elementName}'")
});
if (foundObject is null)
@ -175,7 +175,7 @@ internal partial class Tmx
return new EllipseObject { };
}
internal static EllipseObject OverrideObject(EllipseObject obj, EllipseObject foundObject) => obj;
internal static EllipseObject OverrideObject(EllipseObject obj, EllipseObject _) => obj;
internal static PointObject ReadPointObject(XmlReader reader)
{
@ -183,7 +183,7 @@ internal partial class Tmx
return new PointObject { };
}
internal static PointObject OverrideObject(PointObject obj, PointObject foundObject) => obj;
internal static PointObject OverrideObject(PointObject obj, PointObject _) => obj;
internal static PolygonObject ReadPolygonObject(XmlReader reader)
{
@ -251,14 +251,14 @@ internal partial class Tmx
"center" => TextHorizontalAlignment.Center,
"right" => TextHorizontalAlignment.Right,
"justify" => TextHorizontalAlignment.Justify,
_ => throw new Exception($"Unknown horizontal alignment '{s}'")
_ => throw new InvalidOperationException($"Unknown horizontal alignment '{s}'")
}) ?? TextHorizontalAlignment.Left;
var vAlign = reader.GetOptionalAttributeEnum<TextVerticalAlignment>("valign", s => s switch
{
"top" => TextVerticalAlignment.Top,
"center" => TextVerticalAlignment.Center,
"bottom" => TextVerticalAlignment.Bottom,
_ => throw new Exception($"Unknown vertical alignment '{s}'")
_ => throw new InvalidOperationException($"Unknown vertical alignment '{s}'")
}) ?? TextVerticalAlignment.Top;
// Elements

View file

@ -66,8 +66,6 @@ internal partial class Tmx
throw new XmlException($"Unkonwn custom class definition: {propertyType}");
}
internal static Dictionary<string, IProperty> CreateInstanceOfCustomClass(CustomClassDefinition customClassDefinition)
{
return customClassDefinition.Members.ToDictionary(m => m.Name, m => m.Clone());
}
internal static Dictionary<string, IProperty> CreateInstanceOfCustomClass(CustomClassDefinition customClassDefinition) =>
customClassDefinition.Members.ToDictionary(m => m.Name, m => m.Clone());
}

View file

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Xml;
@ -40,19 +41,19 @@ internal partial class Tmx
"bottomleft" => ObjectAlignment.BottomLeft,
"bottom" => ObjectAlignment.Bottom,
"bottomright" => ObjectAlignment.BottomRight,
_ => throw new Exception($"Unknown object alignment '{s}'")
_ => throw new InvalidOperationException($"Unknown object alignment '{s}'")
}) ?? ObjectAlignment.Unspecified;
var renderSize = reader.GetOptionalAttributeEnum<TileRenderSize>("rendersize", s => s switch
{
"tile" => TileRenderSize.Tile,
"grid" => TileRenderSize.Grid,
_ => throw new Exception($"Unknown render size '{s}'")
_ => throw new InvalidOperationException($"Unknown render size '{s}'")
}) ?? TileRenderSize.Tile;
var fillMode = reader.GetOptionalAttributeEnum<FillMode>("fillmode", s => s switch
{
"stretch" => FillMode.Stretch,
"preserve-aspect-fit" => FillMode.PreserveAspectFit,
_ => throw new Exception($"Unknown fill mode '{s}'")
_ => throw new InvalidOperationException($"Unknown fill mode '{s}'")
}) ?? FillMode.Stretch;
// Elements
@ -124,7 +125,7 @@ internal partial class Tmx
"jpg" => ImageFormat.Jpg,
"bmp" => ImageFormat.Bmp,
"gif" => ImageFormat.Gif,
_ => throw new Exception($"Unknown image format '{s}'")
_ => throw new InvalidOperationException($"Unknown image format '{s}'")
});
var source = reader.GetOptionalAttribute("source");
var transparentColor = reader.GetOptionalAttributeClass<Color>("trans");
@ -182,7 +183,7 @@ internal partial class Tmx
{
"orthogonal" => GridOrientation.Orthogonal,
"isometric" => GridOrientation.Isometric,
_ => throw new Exception($"Unknown orientation '{s}'")
_ => throw new InvalidOperationException($"Unknown orientation '{s}'")
}) ?? GridOrientation.Orthogonal;
var width = reader.GetRequiredAttributeParseable<uint>("width");
var height = reader.GetRequiredAttributeParseable<uint>("height");
@ -255,10 +256,8 @@ internal partial class Tmx
internal static List<Wangset> ReadWangsets(
XmlReader reader,
IReadOnlyCollection<CustomTypeDefinition> customTypeDefinitions)
{
return reader.ReadList<Wangset>("wangsets", "wangset", r => ReadWangset(r, customTypeDefinitions));
}
IReadOnlyCollection<CustomTypeDefinition> customTypeDefinitions) =>
reader.ReadList<Wangset>("wangsets", "wangset", r => ReadWangset(r, customTypeDefinitions));
internal static Wangset ReadWangset(
XmlReader reader,
@ -334,7 +333,7 @@ internal partial class Tmx
var wangID = reader.GetRequiredAttributeParseable<byte[]>("wangid", s =>
{
// Comma-separated list of indices (0-254)
var indices = s.Split(',').Select(i => byte.Parse(i)).ToArray();
var indices = s.Split(',').Select(i => byte.Parse(i, CultureInfo.InvariantCulture)).ToArray();
if (indices.Length > 8)
throw new ArgumentException("Wang ID can have at most 8 indices.");
return indices;

View file

@ -39,14 +39,11 @@ public class TmxMapReader : IMapReader
_customTypeDefinitions = customTypeDefinitions ?? throw new ArgumentNullException(nameof(customTypeDefinitions));
// Prepare reader
_reader.MoveToContent();
_ = _reader.MoveToContent();
}
/// <inheritdoc/>
public Map ReadMap()
{
return Tmx.ReadMap(_reader, _externalTilesetResolver, _externalTemplateResolver, _customTypeDefinitions);
}
public Map ReadMap() => Tmx.ReadMap(_reader, _externalTilesetResolver, _externalTemplateResolver, _customTypeDefinitions);
/// <inheritdoc/>
protected virtual void Dispose(bool disposing)
@ -77,6 +74,6 @@ public class TmxMapReader : IMapReader
{
// Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
Dispose(disposing: true);
System.GC.SuppressFinalize(this);
GC.SuppressFinalize(this);
}
}

View file

@ -35,7 +35,7 @@ public class TsxTilesetReader : ITilesetReader
_customTypeDefinitions = customTypeDefinitions ?? throw new ArgumentNullException(nameof(customTypeDefinitions));
// Prepare reader
_reader.MoveToContent();
_ = _reader.MoveToContent();
}
/// <inheritdoc/>
@ -49,6 +49,7 @@ public class TsxTilesetReader : ITilesetReader
if (disposing)
{
// TODO: dispose managed state (managed objects)
_reader.Dispose();
}
// TODO: free unmanaged resources (unmanaged objects) and override finalizer
@ -69,6 +70,6 @@ public class TsxTilesetReader : ITilesetReader
{
// Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
Dispose(disposing: true);
System.GC.SuppressFinalize(this);
GC.SuppressFinalize(this);
}
}

View file

@ -39,7 +39,7 @@ public class TxTemplateReader : ITemplateReader
_customTypeDefinitions = customTypeDefinitions ?? throw new ArgumentNullException(nameof(customTypeDefinitions));
// Prepare reader
_reader.MoveToContent();
_ = _reader.MoveToContent();
}
/// <inheritdoc/>
@ -53,6 +53,7 @@ public class TxTemplateReader : ITemplateReader
if (disposing)
{
// TODO: dispose managed state (managed objects)
_reader.Dispose();
}
// TODO: free unmanaged resources (unmanaged objects) and override finalizer
@ -73,6 +74,6 @@ public class TxTemplateReader : ITemplateReader
{
// Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
Dispose(disposing: true);
System.GC.SuppressFinalize(this);
GC.SuppressFinalize(this);
}
}