/** * File Name: fflib_ArrayUtilsTest * @description * * @author architect ir. Wilhelmus G.J. Velzeboer | wim@velzeboer.nl */ @IsTest(IsParallel=true) private class fflib_ArrayUtilsTest { @IsTest static void testObjectToString() { System.Assert.areEqual( new List {'123', '456', '789'}, fflib_ArrayUtils.objectToString( new List {123, 456, 789} ) ); } @IsTest static void testObjectStringToString() { System.Assert.areEqual( new List {'123', '456', '789'}, fflib_ArrayUtils.objectToString( new List {'123', '456', '789'} ) ); } @IsTest static void itShouldReturnEmptyListOnEmptyObjectToString() { System.Assert.areEqual( new List(), fflib_ArrayUtils.objectToString( new List() ) ); } @IsTest static void itShouldConvertSetToListOfString() { System.Assert.areEqual( new List {'1', '2', '3'}, fflib_ArrayUtils.objectToString( new Set {1, 2, 3} ) ); } @IsTest static void itShouldConvertSetObjectToSetOfIds() { Id idA = fflib_IDGenerator.generate(Account.SObjectType); Id idB = fflib_IDGenerator.generate(Account.SObjectType); System.Assert.areEqual( new Set {idA, idB}, fflib_ArrayUtils.objectToIds( new Set { (Object) idA, (Object) idB } ) ); } @IsTest static void itShouldReturnReversedObjectList() { System.Assert.areEqual( new List { (Object) 'C', (Object) 'B', (Object) 'A' }, fflib_ArrayUtils.reverse( new List { (Object) 'A', (Object) 'B', (Object) 'C' } ) ); } @IsTest static void itShouldReturnReversedSObjectList() { System.Assert.areEqual( new List { (SObject) new Account(Name = 'C'), (SObject) new Account(Name = 'B'), (SObject) new Account(Name = 'A') }, fflib_ArrayUtils.reverse( new List { (SObject) new Account(Name = 'A'), (SObject) new Account(Name = 'B'), (SObject) new Account(Name = 'C') } ) ); } @IsTest static void itShouldConvertListOfStringsIntoUpperCase() { System.Assert.areEqual( new List { 'TEST A', 'TEST B', 'TEST C' }, fflib_ArrayUtils.upperCase( new List { 'test a', 'test b', 'test c' } ) ); } @IsTest static void testLowerCase() { System.Assert.areEqual( new List {'abc', 'def'}, fflib_ArrayUtils.lowerCase( new List {'ABC', 'DEF'} ) ); } @IsTest static void testIsEmpty() { List aNull = null; System.Assert.istrue(fflib_ArrayUtils.isEmpty(aNull)); System.Assert.istrue(fflib_ArrayUtils.isEmpty(new List {})); System.Assert.isfalse(fflib_ArrayUtils.isEmpty(new List {'a'})); System.Assert.isfalse(fflib_ArrayUtils.isEmpty(new List {'a', 'b'})); System.Assert.istrue(fflib_ArrayUtils.isEmpty(new List {})); System.Assert.isfalse(fflib_ArrayUtils.isEmpty(new List {1})); System.Assert.isfalse(fflib_ArrayUtils.isEmpty(new List {1, 2})); } @IsTest static void testIsNotEmpty() { List aNull = null; System.Assert.isfalse(fflib_ArrayUtils.isNotEmpty(aNull)); System.Assert.isfalse(fflib_ArrayUtils.isNotEmpty(new List {})); System.Assert.istrue(fflib_ArrayUtils.isNotEmpty(new List {'a'})); System.Assert.istrue(fflib_ArrayUtils.isNotEmpty(new List {'a', 'b'})); System.Assert.isfalse(fflib_ArrayUtils.isNotEmpty(new List {})); System.Assert.istrue(fflib_ArrayUtils.isNotEmpty(new List {1})); System.Assert.istrue(fflib_ArrayUtils.isNotEmpty(new List {1, 2})); System.Assert.isfalse(fflib_ArrayUtils.isNotEmpty(new List {})); System.Assert.istrue(fflib_ArrayUtils.isNotEmpty(new List {new Account(Name = 'test')})); } @IsTest static void itShouldReturnMostRecentDatetime() { // GIVEN - a list of unsorted Datetime values List datetimes = generateDateTimes(); // WHEN - we request the maxDatetime Datetime maxDatetime = fflib_ArrayUtils.maxDatetime(datetimes); // THEN - the highest Datetime should be returned System.Assert.areEqual(datetimes.get(1), maxDatetime); } @IsTest static void itShouldReturnOldestDatetime() { // GIVEN - a list of unsorted Datetime values List datetimes = generateDateTimes(); // WHEN - we request the maxDatetime Datetime maxDatetime = fflib_ArrayUtils.minDatetime(datetimes); // THEN - the highest Datetime should be returned System.Assert.areEqual(datetimes.get(4), maxDatetime); } @IsTest static void itShouldHandleNullInputsForMaxDatatime() { System.Assert.isNull( fflib_ArrayUtils.maxDatetime(new List()), 'maxDatetime method was unable to handle an empty list as input' ); System.Assert.isNull( fflib_ArrayUtils.maxDatetime(null), 'maxDatetime method was unable to handle null as input' ); } @IsTest static void itShouldCloneAndSortTheList() { // GIVEN - a list of unsorted numbers List unsorted = new List { 1, 30, 2, 76, -7 }; // WHEN - we request the a cloned and sorted list List sorted = fflib_ArrayUtils.cloneAndSort(unsorted); System.Assert.areNotEqual(unsorted, sorted, 'The original object was modified, something went wrong with the cloning'); System.Assert.areEqual(new List {-7, 1, 2, 30, 76}, sorted, 'Incorrect sorted list returned'); } @IsTest static void itShouldReturnTheLastValueInTheList() { // GIVEN - a list of unsorted values List objects = new List {1, 2, 3, 9, 4, 7, 8}; // WHEN - we request the last value Object result = fflib_ArrayUtils.lastValue(objects); // THEN - the highest Datetime should be returned System.Assert.areEqual(8, result, 'Did not return the last value in the list of objects'); } @IsTest static void itShouldReplaceValueInTheMap() { Id accountIdA = fflib_IDGenerator.generate(Schema.Account.SObjectType); Id accountIdB = fflib_IDGenerator.generate(Schema.Account.SObjectType); Id accountIdC = fflib_IDGenerator.generate(Schema.Account.SObjectType); Id contactIdA = fflib_IDGenerator.generate(Schema.Contact.SObjectType); Id contactIdB = fflib_IDGenerator.generate(Schema.Contact.SObjectType); Map source = new Map { accountIdA => contactIdA, accountIdB => contactIdB, accountIdC => fflib_IDGenerator.generate(Schema.Contact.SObjectType) }; Map replacement = new Map { contactIdA => accountIdB, contactIdB => accountIdA }; Map result = fflib_ArrayUtils.replaceValue(source, replacement); System.Assert.areEqual(3, result.size()); System.Assert.areEqual(accountIdB, result.get(accountIdA)); System.Assert.areEqual(accountIdA, result.get(accountIdB)); System.Assert.isNull(result.get(accountIdC)); } @IsTest static void itShouldReturnAllValuesForTheGivenIds() { // GIVEN a map with String by Ids final Id accountIdA = fflib_IDGenerator.generate(Schema.Account.SObjectType); final Id accountIdB = fflib_IDGenerator.generate(Schema.Account.SObjectType); final Id accountIdC = fflib_IDGenerator.generate(Schema.Account.SObjectType); final Map stringsByIds = new Map { accountIdA => 'Account A', accountIdB => 'Account B', accountIdC => 'Account C' }; // WHEN we retrieve a sub-set of Ids Set result = fflib_ArrayUtils.getAllValues(stringsByIds, new Set {accountIdA, accountIdB}); // THEN we get the values of the provide sub-set Ids System.Assert.istrue(result.containsAll(new Set {'Account A', 'Account B'})); } @IsTest static void itShouldReturnMergedMap() { final Id accountIdA = fflib_IDGenerator.generate(Schema.Account.SObjectType); final Id accountIdB = fflib_IDGenerator.generate(Schema.Account.SObjectType); final Id accountIdC = fflib_IDGenerator.generate(Schema.Account.SObjectType); final Set ids = new Set {accountIdA, accountIdB, accountIdC}; final Map> stringsByIdsA = new Map> { accountIdA => new Set {'A1', 'A2'}, accountIdB => new Set {'B1'} }; final Map> stringsByIdsB = new Map> { accountIdA => new Set {'A3'}, accountIdC => new Set {'C1'} }; Map> result = fflib_ArrayUtils.mergeMaps(stringsByIdsA, stringsByIdsB); System.Assert.istrue(result.keySet().containsAll(ids)); System.Assert.istrue(result.get(accountIdA).containsAll(new Set{'A1', 'A2', 'A3'})); System.Assert.areEqual(3, result.get(accountIdA).size()); System.Assert.istrue(result.get(accountIdB).contains('B1')); System.Assert.areEqual(1, result.get(accountIdB).size()); System.Assert.istrue(result.get(accountIdC).contains('C1')); System.Assert.areEqual(1, result.get(accountIdC).size()); } private static List generateDateTimes() { return new List { Datetime.newInstance(2020, 01, 01, 07, 59, 7), Datetime.newInstance(2020, 02, 01, 07, 40, 7), Datetime.newInstance(2020, 02, 01, 07, 00, 7), Datetime.newInstance(2019, 02, 01, 07, 59, 7), Datetime.newInstance(2018, 07, 07, 07, 7, 7) }; } }