public static Slot[] copySlotArray(Slot[] arr) { Slot[] result = new Slot[arr.length]; for (int i = 0; i < arr.length; i++) { result[i] = new Slot(arr[i]); } return result; } }
@Override public Slot createFromParcel(Parcel source) { return new Slot(source); }
public static Slot hardcodedSlot(char value) { return new Slot(Slot.RULES_HARDCODED, value, null); }
private static void linkSlots(@NonNull Slot[] slots, SlotsList list) { list.firstSlot = new Slot(slots[0]); Slot prev = list.firstSlot; if (list.size == 1) { list.lastSlot = list.firstSlot; } // link slots for (int i = 1; i < slots.length; i++) { Slot next = new Slot(slots[i]); prev.setNextSlot(next); next.setPrevSlot(prev); prev = next; if (i == slots.length - 1) { list.lastSlot = next; } } }
public static Slot digit() { return new Slot(null, new SlotValidators.DigitValidator()); }
public static Slot maskableDigit() { return new Slot(null, new SlotValidators.MaskedDigitValidator()); }
public static Slot any() { return new Slot(null, new SlotValidators.GenerousValidator()); }
public SlotsList(@NonNull SlotsList list) { if (!list.isEmpty()) { Slot previous = null; for (Slot slot : list) { final Slot newSlot = new Slot(slot); if (size == 0) { this.firstSlot = newSlot; } else { previous.setNextSlot(newSlot); newSlot.setPrevSlot(previous); } previous = newSlot; size++; } this.lastSlot = previous; } }
@Override protected Slot slotFromNonUnderscoredChar(char character) { if (!Character.isDigit(character)) { rule = Slot.RULE_INPUT_MOVES_INPUT | Slot.RULE_INPUT_REPLACE; final Slot hardcoded = PredefinedSlots.hardcodedSlot(character); return character == PLUS_SIGN ? hardcoded : hardcoded.withTags(Slot.TAG_DECORATION); } final Slot slot = new Slot(rule, character, SlotValidatorSet.setOf(new SlotValidators.DigitValidator())); rule = Slot.RULE_INPUT_MOVES_INPUT; return slot; } }
@Test public void replace(){ Mask mask = new MaskImpl( new Slot[]{ new Slot(Slot.RULE_INPUT_REPLACE, '1', SlotValidatorSet.setOf(new SlotValidators.GenerousValidator())), new Slot(Slot.RULE_INPUT_REPLACE, '2', SlotValidatorSet.setOf(new SlotValidators.GenerousValidator())), new Slot(Slot.RULE_INPUT_REPLACE, '3', SlotValidatorSet.setOf(new SlotValidators.GenerousValidator())), new Slot(Slot.RULE_INPUT_REPLACE, null, SlotValidatorSet.setOf(new SlotValidators.GenerousValidator())) }, true ); assertEquals("123", mask.toString()); assertEquals(1,mask.insertFront("0")); assertEquals(2,mask.insertAt(1, "1")); assertEquals("013", mask.toString()); }
final Slot toInsert = new Slot(slot);
@Test public void setValueOffset(){ Slot b = new Slot(Slot.RULES_DEFAULT, null, null); assertEquals(1, b.setValue(' ')); assertEquals(1, b.setValue('2')); Slot c = new Slot(Slot.RULES_DEFAULT, null, null); c.setPrevSlot(b); b.setNextSlot(c); assertEquals(1, c.setValue('3')); Slot a = new Slot(Slot.RULE_INPUT_MOVES_INPUT, 'a', null); b.setPrevSlot(a); a.setNextSlot(b); assertEquals(1, a.setValue('a')); assertEquals(2, a.setValue('3')); Slot a0 = new Slot(Slot.RULE_INPUT_MOVES_INPUT, 'a', null); a.setPrevSlot(a); a0.setNextSlot(a); assertEquals(1, a0.setValue('a')); assertEquals(3, a0.setValue(' ')); }
@Test public void invalidValueNotRemovedFromNext() { Slot first = new Slot('0', new SlotValidators.DigitValidator()); Slot second = new Slot('a', new SlotValidators.LetterValidator()); first.setNextSlot(second); second.setPrevSlot(first); first.setValue(null); Assert.assertEquals(new Character('a'), second.getValue()); }
@Test public void validValueCopiedFromNext() { Slot first = new Slot('1', new SlotValidators.DigitValidator()); Slot second = new Slot('2', new SlotValidators.DigitValidator()); first.setNextSlot(second); second.setPrevSlot(first); first.setValue(null); Assert.assertEquals(new Character('2'), first.getValue()); }
@Test public void parcelable() { Slot before = new Slot(Slot.RULES_DEFAULT, 'x', SlotValidatorSet.setOf(new SlotValidators.MaskedDigitValidator())); Parcel parcel = Parcel.obtain(); before.writeToParcel(parcel, 0); parcel.setDataPosition(0); Slot after = Slot.CREATOR.createFromParcel(parcel); assertEquals(before, after); parcel.recycle(); }