@@ -0,0 +1,1616 @@
+package org.museautomation.builtins.value.string;%0A%0Aimport org.junit.jupiter.api.*;%0Aimport org.museautomation.builtins.value.file.*;%0Aimport org.museautomation.core.*;%0Aimport org.museautomation.core.mocks.*;%0Aimport org.museautomation.core.resource.*;%0Aimport org.museautomation.core.values.*;%0A%0Aimport java.io.*;%0A%0A/**%0A * @author Christopher L Merrill (see LICENSE.txt for license details)%0A */%0Apublic class StringUtilitySourceTests%0A    %7B%0A    @Test%0A    public void cutString() throws MuseInstantiationException, ValueSourceResolutionError%0A        %7B%0A        ValueSourceConfiguration config = ValueSourceConfiguration.forType(CutStringSource.TYPE_ID);%0A        config.addSource(CutStringSource.SOURCE_PARAM, ValueSourceConfiguration.forValue(%22https://a.1stdibscdn.com/classical-marble-bust-of-hermes-holding-dionysus-after-the-antique-by-praxiteles-for-sale-picture-2/f_10590/1579695197244/Large_Marble_Sculpture_Male_Bust03_master.jpg?width=768%22));%0A        config.addSource(CutStringSource.MAX_LENGTH_PARAM, ValueSourceConfiguration.forValue(12));%0A        config.addSource(CutStringSource.FROM_END_PARAM, ValueSourceConfiguration.forValue(true));%0A        MuseValueSource source = config.createSource();%0A        Assertions.assertEquals(%22https://a.1s%22, source.resolveValue(new MockStepExecutionContext()));%0A%0A        config.removeSource(CutStringSource.FROM_END_PARAM);%0A        config.addSource(CutStringSource.FROM_END_PARAM, ValueSourceConfiguration.forValue(false));%0A        source = config.createSource();%0A        Assertions.assertEquals(%22pg?width=768%22, source.resolveValue(new MockStepExecutionContext()));%0A        %7D%0A    %7D

Add unit test for Cut String source