| using System; |
| using System.Collections.Generic; |
| using Casbin.Model; |
| |
| namespace Casbin.UnitTests.ParallelTest |
| { |
| public class DefaultRandomEntropyPool<TRequest> : IEntropyPool<TRequest> where TRequest : IRequestValues |
| { |
| private readonly int _defaultRandomStringLength = 3; |
| private readonly string _randomStringSource = "abcdefghijklmnopqrstuvwxyz0123456789"; |
| private Func<List<string>, TRequest> _convertFunc; |
| |
| /// <summary> |
| /// A dictionary to save the random element pools for each category. |
| /// </summary> |
| public Dictionary<string, List<string>> _elementPools; |
| |
| public DefaultRandomEntropyPool(Func<List<string>, TRequest> list2RequestFunc) |
| { |
| _convertFunc = list2RequestFunc; |
| _elementPools = new Dictionary<string, List<string>>(); |
| } |
| |
| public DefaultRandomEntropyPool(Func<List<string>, TRequest> list2RequestFunc, |
| Dictionary<string, List<string>> elementPools) |
| { |
| _convertFunc = list2RequestFunc; |
| _elementPools = elementPools; |
| } |
| |
| /// <summary> |
| /// |
| /// </summary> |
| /// <param name="categoryAndCount"> The first element is the category, the second is the count |
| /// of elements you want to put in the element pool.</param> |
| public DefaultRandomEntropyPool(Func<List<string>, TRequest> list2RequestFunc, |
| params KeyValuePair<string, int>[] categoryAndCount) |
| { |
| _convertFunc = list2RequestFunc; |
| _elementPools = new Dictionary<string, List<string>>(); |
| for (int i = 0; i < categoryAndCount.Length; i++) |
| { |
| List<string> values = []; |
| for (int j = 0; j < categoryAndCount[i].Value; j++) |
| { |
| values.Add(GetRandomString(_defaultRandomStringLength)); |
| } |
| |
| _elementPools.Add(categoryAndCount[i].Key, values); |
| } |
| } |
| |
| public TRequest Get() |
| { |
| List<string> res = []; |
| foreach (var keyValue in _elementPools) |
| { |
| Random rd = new Random(); |
| res.Add(keyValue.Value[rd.Next(0, keyValue.Value.Count)]); |
| } |
| |
| return _convertFunc(res); |
| } |
| |
| public void Add(TRequest request) |
| { |
| var enumerator = _elementPools.GetEnumerator(); |
| for (int i = 0; i < request.Count; i++) |
| { |
| enumerator.MoveNext(); |
| enumerator.Current.Value.Add(request[i]); |
| } |
| } |
| |
| public DefaultRandomEntropyPool<TRequest> Add(string key, int count) |
| { |
| List<string> values = []; |
| while (count-- > 0) |
| { |
| values.Add(GetRandomString(_defaultRandomStringLength)); |
| } |
| |
| _elementPools.Add(key, values); |
| return this; |
| } |
| |
| public DefaultRandomEntropyPool<TRequest> Add(string key, string value) |
| { |
| if (_elementPools.ContainsKey(key)) |
| { |
| _elementPools[key].Add(value); |
| } |
| else |
| { |
| _elementPools.Add(key, [value]); |
| } |
| |
| return this; |
| } |
| |
| private string GetRandomString(int length) |
| { |
| string res = ""; |
| while (length-- > 0) |
| { |
| Random rd = new Random(); |
| res += _randomStringSource[rd.Next(0, _randomStringSource.Length)]; |
| } |
| |
| return res; |
| } |
| } |
| |
| public static class DefaultRandomEntropyPool |
| { |
| public static DefaultRandomEntropyPool<RequestValues<string>> Create( |
| params KeyValuePair<string, int>[] categoryAndCount) |
| { |
| return new DefaultRandomEntropyPool<RequestValues<string>>(x => Request.CreateValues(x[0]), |
| categoryAndCount); |
| } |
| |
| public static DefaultRandomEntropyPool<RequestValues<string, string>> Create2( |
| params KeyValuePair<string, int>[] categoryAndCount) |
| { |
| return new DefaultRandomEntropyPool<RequestValues<string, string>>(x => Request.CreateValues(x[0], x[1]), |
| categoryAndCount); |
| } |
| |
| public static DefaultRandomEntropyPool<RequestValues<string, string, string>> Create3( |
| params KeyValuePair<string, int>[] categoryAndCount) |
| { |
| return new DefaultRandomEntropyPool<RequestValues<string, string, string>>( |
| x => Request.CreateValues(x[0], x[1], x[2]), categoryAndCount |
| ); |
| } |
| |
| public static DefaultRandomEntropyPool<RequestValues<string, string, string, string>> |
| Create4(params KeyValuePair<string, int>[] categoryAndCount) |
| { |
| return new DefaultRandomEntropyPool<RequestValues<string, string, string, string>>( |
| x => Request.CreateValues(x[0], x[1], x[2], x[3]), categoryAndCount |
| ); |
| } |
| |
| public static DefaultRandomEntropyPool<RequestValues<string, string, string, string, string>> |
| Create5(params KeyValuePair<string, int>[] categoryAndCount) |
| { |
| return new DefaultRandomEntropyPool<RequestValues<string, string, string, string, string>>( |
| x => Request.CreateValues(x[0], x[1], x[2], x[3], x[4]), categoryAndCount |
| ); |
| } |
| |
| public static DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string>> |
| Create6(params KeyValuePair<string, int>[] categoryAndCount) |
| { |
| return new DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string>>( |
| x => Request.CreateValues(x[0], x[1], x[2], x[3], x[4], x[5]), categoryAndCount |
| ); |
| } |
| |
| public static DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string, string>> |
| Create7(params KeyValuePair<string, int>[] categoryAndCount) |
| { |
| return new DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string, string>>( |
| x => Request.CreateValues(x[0], x[1], x[2], x[3], x[4], x[5], x[6]), categoryAndCount |
| ); |
| } |
| |
| public static DefaultRandomEntropyPool< |
| RequestValues<string, string, string, string, string, string, string, string>> |
| Create8(params KeyValuePair<string, int>[] categoryAndCount) |
| { |
| return new DefaultRandomEntropyPool< |
| RequestValues<string, string, string, string, string, string, string, string>>( |
| x => Request.CreateValues(x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7]), categoryAndCount |
| ); |
| } |
| |
| public static DefaultRandomEntropyPool< |
| RequestValues<string, string, string, string, string, string, string, string, string>> |
| Create9(params KeyValuePair<string, int>[] categoryAndCount) |
| { |
| return new DefaultRandomEntropyPool< |
| RequestValues<string, string, string, string, string, string, string, string, string>>( |
| x => Request.CreateValues(x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8]), categoryAndCount |
| ); |
| } |
| |
| public static DefaultRandomEntropyPool< |
| RequestValues<string, string, string, string, string, string, string, string, string, string>> |
| Create10(params KeyValuePair<string, int>[] categoryAndCount) |
| { |
| return new DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string, string, |
| string, string, string>>( |
| x => Request.CreateValues(x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8], x[9]), categoryAndCount |
| ); |
| } |
| |
| public static DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string, string, |
| string, string, string, string>> |
| Create11(params KeyValuePair<string, int>[] categoryAndCount) |
| { |
| return new DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string, string, |
| string, string, string, string>>( |
| x => Request.CreateValues(x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8], x[9], x[10]), |
| categoryAndCount |
| ); |
| } |
| |
| public static DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string, string, |
| string, string, string, string, string>> |
| Create12(params KeyValuePair<string, int>[] categoryAndCount) |
| { |
| return new DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string, string, |
| string, string, string, string, string>>( |
| x => Request.CreateValues(x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8], x[9], x[10], x[11]), |
| categoryAndCount |
| ); |
| } |
| } |
| } |