def build_random_string_insert(self): doc = self.doc snapshot = doc.get_snapshot() val = '' if len(self.remaining_chars) < 4: val = self.remaining_chars else: # pick random sample size k = random.choice(xrange(2, 5)) # pick random letters val = ''.join(random.sample(self.remaining_chars, k)) # pick random insertion point offset = random.choice(xrange(len(snapshot) + 1)) # The inserted characters should appear after any existing character # before the offset previous_chars = snapshot[:offset] for char in previous_chars: self.results[char]['after'].extend(list(val)) # The inserted characters should appear before any existing character # after the insertion subsequent_chars = snapshot[offset:] for char in subsequent_chars: self.results[char]['before'].extend(list(val)) for i, char in enumerate(val): r = self.results[char] r['before'] = list(snapshot[:offset]) r['before'].extend(list(val[:i])) r['after'] = list(snapshot[offset:]) r['after'].extend(list(val[i + 1:])) self.remaining_chars = self.remaining_chars.replace(char, '') op = Op('si', [], offset=offset, val=val) op.cheat = previous_chars + " " + val + " " + subsequent_chars return op
def build_random_string_delete(self): doc = self.doc snapshot = doc.get_snapshot() # pick random offset offset = 0 if len(snapshot) > 1: offset = random.choice(xrange(len(snapshot))) # get random size for delete range characters_past_offset = len(snapshot[offset:]) max_val = min(5, characters_past_offset) val = 0 # as long as there is something in the snapshot, pick a delete size # larger than zero if characters_past_offset != 0: val = random.choice(xrange(max_val)) + 1 deleted_chars = snapshot[offset:offset + val] for char in deleted_chars: self.results[char]['deleted'] = True op = Op('sd', [], offset=offset, val=val) op.cheat = "delete " + deleted_chars return op