Skip to content

Commit

Permalink
Merge pull request #1 from adam-dot-cohen/v0.2.7
Browse files Browse the repository at this point in the history
V0.2.7
  • Loading branch information
adam-dot-cohen authored Feb 17, 2023
2 parents c1ef328 + 72b1225 commit a046cfb
Show file tree
Hide file tree
Showing 13 changed files with 752 additions and 232 deletions.
4 changes: 3 additions & 1 deletion Initialize.Benchmarks/Benchmarks.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@ public ChampionChallengerBenchmarks()
{
//Initialize mapper
var config = new MapperConfiguration(cfg =>
cfg.CreateMap<Test, Test2>());
cfg.CreateMap<Test, Test2>().ForMember(x=>
x.PropString,
x=>x.MapFrom(x=>x.PropString)));
_autoMapper = new MapperA(config);

//Initialize mapper
Expand Down
56 changes: 28 additions & 28 deletions Initialize.Benchmarks/CollectionBenchmarks.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,25 +60,25 @@ public void Setup()
PropString = "a",
};

[Benchmark(Description = "Mapper", Baseline = true)]
public void Mapper()
{
var test2 = new Test2();
//[Benchmark(Description = "Mapper", Baseline = true)]
//public void Mapper()
//{
// var test2 = new Test2();

var result = Mapper<Test, Test2>.Map(_testObjects);
// var result = Mapper<Test, Test2>.Map(_testObjects);

Debug.Assert(result.Count() == _testObjects.Count());
}
// Debug.Assert(result.Count() == _testObjects.Count());
//}

[Benchmark(Description = "AutoMapper")]
public void AutoMapper()
{
var test2 = new Test2();
//[Benchmark(Description = "AutoMapper")]
//public void AutoMapper()
//{
// var test2 = new Test2();

var result = _autoMapper.Map<List<Test>>(_testObjects);
// var result = _autoMapper.Map<List<Test>>(_testObjects);

Debug.Assert(result.Count == _testObjects.ToList().Count);
}
// Debug.Assert(result.Count == _testObjects.ToList().Count);
//}
}

[SimpleJob(runStrategy: RunStrategy.Throughput, launchCount: 1, invocationCount: 1, iterationCount:10,
Expand Down Expand Up @@ -122,23 +122,23 @@ public void Setup()
PropString = "a",
};

[Benchmark(Description = "Mapper", Baseline = true)]
public void MapperEnumerable()
{
var test2 = new Test2();
//[Benchmark(Description = "Mapper", Baseline = true)]
//public void MapperEnumerable()
//{
// var test2 = new Test2();

var result = Mapper<Test, Test2>.Map(_testEnumerable);
// var result = Mapper<Test, Test2>.Map(_testEnumerable);

Debug.Assert(result.Count() == _testObjects.Count);
}
// Debug.Assert(result.Count() == _testObjects.Count);
//}

[Benchmark(Description = "AutoMapper")]
public void AutoMapperEnumerable()
{
var test2 = new Test2();
//[Benchmark(Description = "AutoMapper")]
//public void AutoMapperEnumerable()
//{
// var test2 = new Test2();

var result = _autoMapper.Map<List<Test>>(_testEnumerable);
// var result = _autoMapper.Map<List<Test>>(_testEnumerable);

Debug.Assert(result.Count() == _testObjects.ToList().Count);
}
// Debug.Assert(result.Count() == _testObjects.ToList().Count);
//}
}
165 changes: 137 additions & 28 deletions Initialize.Tests/UnitTest1.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
using System;
using System.Buffers.Text;
using System.Collections;
using System.Collections.Immutable;
using System.Linq.Expressions;
using System.Reflection;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Text.Unicode;
using Initialize.Generators;
using NUnit.Framework.Constraints;

namespace Initialize.Tests;

Expand All @@ -19,11 +26,11 @@ public void Setup()
// var test2 = new Test2();

// // 1. Optional - Customize default configuration
// //Initializer<Test>.Template.Clear();
// //Initializer<Test>.DefaultTemplate.Clear();

// //Initializer<Test>.Template.Add(typeof(string), (obj, propInfo, friendlyTypeName) => "string.Empty");
// //Initializer<Test>.Template.Add(typeof(ValueType), (obj, propInfo, friendlyTypeName) => "default" );
// //Initializer<Test>.Template.Add(typeof(Nullable<>),
// //Initializer<Test>.DefaultTemplate.Add(typeof(string), (obj, propInfo, friendlyTypeName) => "string.Empty");
// //Initializer<Test>.DefaultTemplate.Add(typeof(ValueType), (obj, propInfo, friendlyTypeName) => "default" );
// //Initializer<Test>.DefaultTemplate.Add(typeof(Nullable<>),
// // (obj, propInfo, friendlyTypeName) =>
// // string.Format("(({2}?){0}.{1})!.GetValueOrDefault()", obj, propInfo.Name, friendlyTypeName ) );

Expand All @@ -41,33 +48,50 @@ public void Setup()
// Assert.True(initializeResult && mapResult);
//}

[Test]
public void Should_equal_count_when_list_is_less_than_batch_size()
{
var items = Enumerable.Range(0, 1).Select(i => new Test { Prop = i, PropString = i.ToString() }).ToList();
//[Test]
//public void Should_equal_count_when_list_is_less_than_batch_size()
//{
// var items = Enumerable.Range(0, 1).Select(i => new Test { Prop = i, PropString = i.ToString() }).ToList();

var result = Mapper<Test, Test2>.Map(items);
// var result = Mapper<Test, Test2>.Map(items);

Assert.AreEqual(items.Count(), result.Count());
}
// Assert.AreEqual(items.Count(), result.Count());
//}

[Test]
public void Should_equal_count_when_list_is_greater_than_batch_size()
{
var items = Enumerable.Range(0, 101).Select(i => new Test { Prop = i, PropString = i.ToString() }).ToList();
//[Test]
//public void Should_equal_count_when_list_is_greater_than_batch_size()
//{
// var items = Enumerable.Range(0, 101).Select(i => new Test { Prop = i, PropString = i.ToString() }).ToList();

var result = Mapper<Test, Test2>.Map(items);
// var result = Mapper<Test, Test2>.Map(items);

Assert.AreEqual(items.Count, result.Count());
}
// Assert.AreEqual(items.Count, result.Count());
//}
//[Test]
//public void Should_equal_count_when_list_is_larg()
//{
// var items = Enumerable.Range(0, 100000).Select(i => new Test { Prop = i, PropString = i.ToString() }).ToList();

// var result = Mapper<Test, Test2>.Map2(items);

// Assert.That(result.Count(), Is.EqualTo(items.Count));
//}
[Test]
public void Should_equal_count_when_list_is_larg()
public void Should_equal_with_manual_config()
{
var items = Enumerable.Range(0, 100000).Select(i => new Test { Prop = i, PropString = i.ToString() }).ToList();

var result = Mapper<Test, Test2>.Map2(items);
MapperConfiguration<Test, Test3>
.Configure(x => x
.For(tLeft => tLeft.PropString, tRight => tRight.PropString)
.For(tLeft => tLeft.FieldNullable, tRight => tRight.FieldNullable)
);

var obj = new Test();
obj.PropString = "1";

var result = Mapper<Test, Test2>.Map(obj);

Assert.AreEqual(items.Count, result.Count());
Assert.That(result.PropString, Is.EqualTo(obj.PropString));
}

[Test]
Expand All @@ -86,18 +110,96 @@ public void Should_equal_count_when_collections_are_not_null()
objFrom.Dictionary = new Dictionary<string, Test3> { { "1", new Test3 { Prop = 1, PropString = "1" } } };

var objTo = Mapper<Test3, Test3>.Map(objFrom);

Assert.AreEqual(objFrom.ValueTypeArray?.Length, objTo.ValueTypeArray?.Length);
Assert.AreEqual(objFrom.Array?.Length, objTo.Array?.Length);
Assert.AreEqual(objFrom.Array2?.Length, objTo.Array2?.Length);
Assert.AreEqual(objFrom.ValueTypeList?.Count, objTo.ValueTypeList?.Count);
Assert.AreEqual(objFrom.List?.Count, objTo.List?.Count);
Assert.AreEqual(objFrom.ValueTypeDictionary?.Count, objTo.ValueTypeDictionary?.Count);
Assert.AreEqual(objFrom.Dictionary?.Count, objTo.Dictionary?.Count);
// Assert.AreEqual(objFrom.ValueTypeHashSet?.Count, objTo.ValueTypeHashSet?.Count);
// Assert.AreEqual(objFrom.ValueTypeHashSet?.Count, objTo.ValueTypeHashSet?.Count);
Assert.AreEqual(objFrom.HashSet?.Count, objTo.HashSet?.Count);
}

[Test]
public void Should_equal_with_manual_config_with_indexer()
{
Memory<byte>[] bytes = {
Encoding.UTF8.GetBytes(DateTime.Now.ToString()),
"8"u8.ToArray(),
""u8.ToArray(), //skip
"1.0"u8.ToArray(),
"hello"u8.ToArray() };

int indexOffset = 0;
MapperConfiguration<Memory<byte>[], ParseTest>
.Configure(x => x
// index 0
.For(t => t.PropDateTimeNullable,
"DateTime.Parse(Encoding.UTF8.GetString( {0} [{1}].Span))", 0)
// index 1
.For(t => t.Prop,
"int.Parse(Encoding.UTF8.GetString( {0} [{1}].Span))", 0)
// index 3 - skipping index 2
.For(t => t.PropDouble,
"double.Parse(Encoding.UTF8.GetString( {0} [{1}].Span))", ++indexOffset)
// index 4
.For(t => t.PropString,
"Encoding.UTF8.GetString( {0} [{1}].Span)", indexOffset)
);

var result = Mapper<Memory<byte>[], ParseTest>.Map(bytes);

// equality values
var equalToDt = DateTime.Parse(Encoding.UTF8.GetString(bytes[0].Span));
var equalToInt = int.Parse(Encoding.UTF8.GetString("8"u8.ToArray()));
var equalToDouble = double.Parse(Encoding.UTF8.GetString(bytes[3].Span));
var equalToString = Encoding.UTF8.GetString(bytes[4].Span);

// equality tests
Assert.That(result.PropDateTimeNullable, Is.EqualTo(equalToDt));
Assert.That(result.Prop, Is.EqualTo(equalToInt));
Assert.That(result.PropDouble, Is.EqualTo(equalToDouble));
Assert.That(result.PropString, Is.EqualTo(equalToString));
}
[Test]
public void Should_equal_with_manual_config_with_indexer_from_ParseUT8()
{
var dtBytes = Encoding.UTF8.GetBytes(DateTime.Now.ToString());
Memory<byte>[] bytes = { dtBytes, "8"u8.ToArray(), ""u8.ToArray(), "1.0"u8.ToArray(), "hello"u8.ToArray() };

int indexOffset = 0;
MapperConfiguration<Memory<byte>[], ParseTest>
.Configure(x => x
// index 0
.ParseFor(t => t.PropDateTimeNullable,
parse => parse.MemoryByteToDateTimeNullable)
// index 1
.ParseFor(t => t.Prop,
parse => parse.MemoryByteToInt)
// index 3 - skipping index 2
.ParseFor(t => t.PropDouble,
parse => parse.MemoryByteToDoubleNullable, ++indexOffset)
// index 4
.ParseFor(t => t.PropString,
parse => parse.MemoryByteToStringNullIfEmpty, indexOffset)
);

var result = Mapper<Memory<byte>[], ParseTest>.Map(bytes);

// equality values
var equalToDt = DateTime.Parse(Encoding.UTF8.GetString(bytes[0].Span));
var equalToInt = int.Parse(Encoding.UTF8.GetString("8"u8.ToArray()));
var equalToDouble = double.Parse(Encoding.UTF8.GetString(bytes[3].Span));
var equalToString = Encoding.UTF8.GetString(bytes[4].Span);

// equality tests
Assert.That(result.PropDateTimeNullable, Is.EqualTo(equalToDt));
Assert.That(result.Prop, Is.EqualTo(equalToInt));
Assert.That(result.PropDouble, Is.EqualTo(equalToDouble));
Assert.That(result.PropString, Is.EqualTo(equalToString));
}
[Test]
public void GenerateDtoWithoutNotifyPropertyChanged()
{
Expand Down Expand Up @@ -138,20 +240,27 @@ private bool AllCommonPropertiesAreEqual<TObject, TObject2>(TObject obj, TObject
return true;
}



private const string generatedDtoWithPropertyChanged =
"using System;\r\nusing System.ComponentModel;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.Serialization;\r\n\r\nnamespace Tester;\r\n[DataContract]\r\npublic class TestDto : INotifyPropertyChanged\r\n{\r\n public TestDto()\r\n {\r\n }\r\n\r\n public TestDto(Initialize.Tests.Test obj)\r\n {\r\n _prop = obj.Prop;\r\n _propNullable = obj.PropNullable;\r\n _propString = obj.PropString;\r\n _fieldNullable = obj.FieldNullable;\r\n }\r\n\r\n private int _prop;\r\n [DataMember(Order = 0)]\r\n public int Prop\r\n {\r\n get => _prop;\r\n set\r\n {\r\n _prop = value;\r\n RaisePropertyChanged();\r\n }\r\n }\r\n\r\n private System.Nullable<int> _propNullable;\r\n [DataMember(Order = 1)]\r\n public System.Nullable<int> PropNullable\r\n {\r\n get => _propNullable;\r\n set\r\n {\r\n _propNullable = value;\r\n RaisePropertyChanged();\r\n }\r\n }\r\n\r\n private string _propString;\r\n [DataMember(Order = 2)]\r\n public string PropString\r\n {\r\n get => _propString;\r\n set\r\n {\r\n _propString = value;\r\n RaisePropertyChanged();\r\n }\r\n }\r\n\r\n private System.Nullable<int> _fieldNullable;\r\n [DataMember(Order = 3)]\r\n public System.Nullable<int> FieldNullable\r\n {\r\n get => _fieldNullable;\r\n set\r\n {\r\n _fieldNullable = value;\r\n RaisePropertyChanged();\r\n }\r\n }\r\n\r\n public event PropertyChangedEventHandler PropertyChanged;\r\n public void RaisePropertyChanged([CallerMemberName] string propertyName = null)\r\n {\r\n if (PropertyChanged != null)\r\n {\r\n PropertyChanged(this, new PropertyChangedEventArgs(propertyName));\r\n }\r\n }\r\n}";
private const string generatedDto =
"using System;\r\nusing System.ComponentModel;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.Serialization;\r\n\r\nnamespace Tester;\r\n[DataContract]\r\npublic class TestDto\r\n{\r\n public TestDto()\r\n {\r\n }\r\n\r\n public TestDto(Initialize.Tests.Test obj)\r\n {\r\n _prop = obj.Prop;\r\n _propNullable = obj.PropNullable;\r\n _propString = obj.PropString;\r\n _fieldNullable = obj.FieldNullable;\r\n }\r\n\r\n private int _prop;\r\n [DataMember(Order = 0)]\r\n public int Prop\r\n {\r\n get => _prop;\r\n set\r\n {\r\n _prop = value;\r\n }\r\n }\r\n\r\n private System.Nullable<int> _propNullable;\r\n [DataMember(Order = 1)]\r\n public System.Nullable<int> PropNullable\r\n {\r\n get => _propNullable;\r\n set\r\n {\r\n _propNullable = value;\r\n }\r\n }\r\n\r\n private string _propString;\r\n [DataMember(Order = 2)]\r\n public string PropString\r\n {\r\n get => _propString;\r\n set\r\n {\r\n _propString = value;\r\n }\r\n }\r\n\r\n private System.Nullable<int> _fieldNullable;\r\n [DataMember(Order = 3)]\r\n public System.Nullable<int> FieldNullable\r\n {\r\n get => _fieldNullable;\r\n set\r\n {\r\n _fieldNullable = value;\r\n }\r\n }\r\n}";
}

public class Test2
{
public int Prop { get; set; }
public int? PropNullable { get; set; }
public string PropString { get; set; }
public int? FieldNullable { get; set; }
}
public class ParseTest
{
public int Prop { get; set; }
public int? PropNullable { get; set; }
public string PropString { get; set; }
public DateTime? PropDateTimeNullable { get; set; }
public double? PropDouble { get; set; }
}
public class Test
{
public int Prop { get; set; }
Expand All @@ -175,6 +284,6 @@ public class Test3
//public IReadOnlyCollection<Test3> ReadOnlyCollection { get; set; }
public Dictionary<int, int> ValueTypeDictionary { get; set; }
public Dictionary<string, Test3> Dictionary { get; set; }
public HashSet<int> ValueTypeHashSet {get;set;}
public HashSet<Test3> HashSet {get;set;}
public HashSet<int> ValueTypeHashSet { get; set; }
public HashSet<Test3> HashSet { get; set; }
}
Loading

0 comments on commit a046cfb

Please sign in to comment.