// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
description: >
    Behavior when position is decremented during result accumulation
es6id: 21.2.5.8
info: >
    16. Repeat, for each result in results,
        [...]
        p. If position ≥ nextSourcePosition, then
           i. NOTE position should not normally move backwards. If it does, it
              is an indication of an ill-behaving RegExp subclass or use of an
              access triggered side-effect to change the global flag or other
              characteristics of rx. In such cases, the corresponding
              substitution is ignored.
           ii. Let accumulatedResult be the String formed by concatenating the
               code units of the current value of accumulatedResult with the
               substring of S consisting of the code units from
               nextSourcePosition (inclusive) up to position (exclusive) and
               with the code units of replacement.
           iii. Let nextSourcePosition be position + matchLength.
features: [Symbol.replace]
---*/

var r = /./g;
var callCount = 0;
r.exec = function() {
  callCount += 1;

  if (callCount === 1) {
    return { index: 3, length: 1, 0: 0 };
  } else if (callCount === 2) {
    return { index: 1, length: 1, 0: 0 };
  }

  return null;
};

assert.sameValue(r[Symbol.replace]('abcde', 'X'), 'abcXe');
assert.sameValue(callCount, 3);
