### Question:
StringComplexFieldActions implements AtlasFieldAction { @AtlasActionProcessor public static Number lastIndexOf(LastIndexOf lastIndexOf, String input) { if (lastIndexOf == null || lastIndexOf.getString() == null) { throw new IllegalArgumentException("LastIndexOf must be specified with a string"); } return input == null ? -1 : input.lastIndexOf(lastIndexOf.getString()); }  @AtlasActionProcessor static String append(Append append, String input); @AtlasActionProcessor(sourceType = FieldType.ANY) static String concatenate(Concatenate concat, List<String> inputs); @AtlasActionProcessor static Boolean endsWith(EndsWith endsWith, String input); @AtlasActionProcessor static String format(Format format, List<Object> input); @AtlasActionProcessor static String genareteUUID(GenerateUUID action); @AtlasActionProcessor static Number indexOf(IndexOf indexOf, String input); @AtlasActionProcessor static Number lastIndexOf(LastIndexOf lastIndexOf, String input); @AtlasActionProcessor static String padStringRight(PadStringRight padStringRight, String input); @AtlasActionProcessor static String padStringLeft(PadStringLeft padStringLeft, String input); @AtlasActionProcessor static String prepend(Prepend action, String input); @AtlasActionProcessor static String replaceAll(ReplaceAll replaceAll, String input); @AtlasActionProcessor static String replaceFirst(ReplaceFirst replaceFirst, String input); @AtlasActionProcessor(sourceType = FieldType.ANY) static String[] split(Split split, String input); @AtlasActionProcessor(sourceType = FieldType.ANY) static String[] repeat(Repeat repeat, String input); @AtlasActionProcessor static Boolean startsWith(StartsWith startsWith, String input); @AtlasActionProcessor static String subString(SubString subString, String input); @AtlasActionProcessor static String subStringAfter(SubStringAfter subStringAfter, String input); @AtlasActionProcessor static String subStringBefore(SubStringBefore subStringBefore, String input); static final String STRING_SEPARATOR_REGEX; static final Pattern STRING_SEPARATOR_PATTERN; }### Answer:
@Test public void testLastIndexOf() { LastIndexOf action = new LastIndexOf(); action.setString(""); assertEquals(-1, StringComplexFieldActions.lastIndexOf(action, null)); assertEquals(0, StringComplexFieldActions.lastIndexOf(action, "")); assertEquals(3, StringComplexFieldActions.lastIndexOf(action, "foo")); action.setString("bar"); assertEquals(-1, StringComplexFieldActions.lastIndexOf(action, null)); assertEquals(-1, StringComplexFieldActions.lastIndexOf(action, "")); assertEquals(-1, StringComplexFieldActions.lastIndexOf(action, "foo")); assertEquals(3, StringComplexFieldActions.lastIndexOf(action, "foobar")); assertEquals(6, StringComplexFieldActions.lastIndexOf(action, "foobarbar")); }
@Test(expected=IllegalArgumentException.class) public void testLastIndexOfNullAction() { StringComplexFieldActions.lastIndexOf(null, null); }
@Test(expected=IllegalArgumentException.class) public void testLastIndexOfNullString() { StringComplexFieldActions.lastIndexOf(new LastIndexOf(), null); }