-
Notifications
You must be signed in to change notification settings - Fork 0
/
DG.cs
118 lines (89 loc) · 4.48 KB
/
DG.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
using System;
using System.Collections.Generic;
using System.Linq;
using Akov.DataGenerator.Common;
using Akov.DataGenerator.Generators;
using Akov.DataGenerator.Mappers;
using Akov.DataGenerator.Processors;
using Akov.DataGenerator.Profiles;
using Akov.DataGenerator.RunBehaviors;
using Akov.DataGenerator.Scheme;
using Akov.DataGenerator.Serializers;
using Newtonsoft.Json;
namespace Akov.DataGenerator;
public class DG
{
private readonly IGeneratorFactory _generatorFactory;
private readonly Lazy<IOHelper> _ioHelper;
private readonly Lazy<DataSchemeMapper> _mapper;
private readonly IRunBehavior _runBehavior;
public DG(IGeneratorFactory? generatorFactory = null,
DataSchemeMapperConfig? mapperConfig = null,
FileReadConfig? fileReadConfig = null,
IRunBehavior? runBehavior = null)
{
_generatorFactory = generatorFactory ?? new GeneratorFactory();
_ioHelper = new Lazy<IOHelper>(() => new IOHelper(fileReadConfig));
_mapper = new Lazy<DataSchemeMapper>(() => new DataSchemeMapper(mapperConfig));
_runBehavior = runBehavior ?? new NullRunBehavior();
}
public DataScheme GetFromFile(string filename)
{
string fileContent = _ioHelper.Value.GetFileContent(filename);
return JsonConvert.DeserializeObject<DataScheme>(fileContent);
}
public DataScheme GetFromType<T>()
=> _mapper.Value.MapFrom<T>();
public string GenerateJson(DataScheme scheme, bool useLast = false)
=> GenerateJson(new DataProcessor(scheme, _generatorFactory), scheme.Root, useLast);
public string GenerateJsonCollection(DataScheme scheme, int count, bool useLast = false)
=> GenerateJsonCollection(new DataProcessor(scheme, _generatorFactory), count, scheme.Root, useLast);
public string GenerateJson<T>(DgProfileBase profile, bool useLast = false)
=> GenerateJson(new TypeDataProcessor<T>(profile, _generatorFactory), typeof(T).Name, useLast);
public string GenerateJsonCollection<T>(DgProfileBase profile, int count, bool useLast = false)
=> GenerateJsonCollection(new TypeDataProcessor<T>(profile, _generatorFactory), count, typeof(T).Name, useLast);
public T GenerateObject<T>(DataScheme scheme, bool useLast = false)
=> JsonConvert.DeserializeObject<T>(GenerateJson(scheme, useLast));
public IEnumerable<T> GenerateObjectCollection<T>(DataScheme scheme, int count, bool useLast = false)
=> JsonConvert.DeserializeObject<IEnumerable<T>>(GenerateJsonCollection(scheme, count, useLast));
public T GenerateObject<T>(DgProfileBase profile, bool useLast = false)
=> JsonConvert.DeserializeObject<T>(GenerateJson<T>(profile, useLast));
public IEnumerable<T> GenerateObjectCollection<T>(DgProfileBase profile, int count, bool useLast = false)
=> JsonConvert.DeserializeObject<IEnumerable<T>>(GenerateJsonCollection<T>(profile, count, useLast));
public void SaveToFile(string filename, string json)
=> _ioHelper.Value.SaveData(filename, json);
private string GenerateJson(IDataProcessor dataProcessor, string? scheme, bool useLast)
{
ValidateUseLast(useLast);
string key = scheme ?? "default";
if (useLast)
return _runBehavior.ReadLast(key);
var data = dataProcessor.CreateData();
var result = JsonValueObjectSerializer.Serialize(data);
if (_runBehavior is not NullRunBehavior)
_runBehavior.SaveResult(key, result);
return result;
}
private string GenerateJsonCollection(IDataProcessor dataProcessor, int count, string? scheme, bool useLast)
{
ValidateUseLast(useLast);
string key = (scheme ?? "default") + "_collection";
if (useLast)
return _runBehavior.ReadLast(key);
var dataList = Enumerable.Range(1, count)
.Select(x =>
{
var data = dataProcessor.CreateData();
return JsonValueObjectSerializer.Serialize(data);
});
var result = $"[{string.Join(",", dataList)}]";
if (_runBehavior is not NullRunBehavior)
_runBehavior.SaveResult(key, result);
return result;
}
private void ValidateUseLast(bool useLast)
{
if (useLast && _runBehavior is NullRunBehavior)
throw new ArgumentException($"{nameof(useLast)} flag cannot be used with {nameof(NullRunBehavior)}");
}
}