### Question:
StringOperationsStepAnalyzer extends StepAnalyzer<StringOperationsMeta> { @Override public Set<ComponentDerivationRecord> getChangeRecords( final StringOperationsMeta stringOperationsMeta ) throws MetaverseAnalyzerException { Set<ComponentDerivationRecord> changeRecords = new HashSet<>(); for ( int i = 0; i < stringOperationsMeta.getFieldInStream().length; i++ ) { String fieldInString = stringOperationsMeta.getFieldInStream()[i]; String fieldOutString = stringOperationsMeta.getFieldOutStream()[i]; if ( Const.isEmpty( fieldOutString ) ) { fieldOutString = fieldInString; } final ComponentDerivationRecord changeRecord = new ComponentDerivationRecord( fieldInString, fieldOutString, ChangeType.DATA ); String trimTypeDescription = stringOperationsMeta.getTrimType()[i]; String lowerUpperDescription = stringOperationsMeta.getLowerUpper()[i]; String initCapDescription = stringOperationsMeta.getInitCap()[i]; String digitsDescription = stringOperationsMeta.getDigits()[i]; String maskXMLDescription = stringOperationsMeta.getMaskXML()[i]; String paddingDescription = stringOperationsMeta.getPaddingType()[i]; String specialCharactersDescription = stringOperationsMeta.getRemoveSpecialCharacters()[i]; String changeOperation = fieldOutString; changeOperation += " { trim = [ " + trimTypeDescription + " ] && "; changeOperation += "lower/upper = [ " + lowerUpperDescription + " ] && "; changeOperation += "padding = [ " + paddingDescription + ( stringOperationsMeta.getPaddingType()[i] .equals( StringOperationsMeta.getPaddingCode( StringOperationsMeta.PADDING_NONE ) ) ? "" : ", " + stringOperationsMeta.getPadChar()[i] ) + ", " + stringOperationsMeta.getPadLen()[i] + " ] && "; changeOperation += "cap = [ " + initCapDescription + " ] && "; changeOperation += "maskXML = [ " + maskXMLDescription + " ] && "; changeOperation += "digits = [ " + digitsDescription + " ] && "; changeOperation += "remove = [ " + specialCharactersDescription + " ] } -> "; changeOperation += fieldOutString; changeRecord.addOperation( new Operation( Operation.CALC_CATEGORY, ChangeType.DATA, DictionaryConst.PROPERTY_TRANSFORMS, changeOperation ) ); changeRecords.add( changeRecord ); } return changeRecords; }  @Override Set<Class<? extends BaseStepMeta>> getSupportedSteps(); @Override Set<ComponentDerivationRecord> getChangeRecords( final StringOperationsMeta stringOperationsMeta );  }### Answer:
@Test public void testGetChangeRecords() throws Exception { Set<ComponentDerivationRecord> changeRecords = analyzer.getChangeRecords( stringOperationsMeta ); assertEquals( changeRecords.size(), 3 ); List<String> inFields = Arrays.asList( stringOperationsMeta.getFieldInStream() ); for ( ComponentDerivationRecord change : changeRecords ) { assertTrue( inFields.contains( change.getOriginalEntityName() ) ); assertEquals( 1, change.getOperations( ChangeType.DATA ).size() ); assertNull( change.getOperations( ChangeType.METADATA ) ); } }