text: // Copyright (C) 2017 Valerie Young. All rights reserved.
  // This code is governed by the BSD license found in the LICENSE file.
  
  /*---
  esid: sec-string.prototype.trimStart
  description: >
    Priority of toString when converting object to string for trimming
  info: |
    Runtime Semantics: TrimString ( string, where )
    1. Let str be ? RequireObjectCoercible(string).
    2. Let S be ? ToString(str).
     ...
  
    ToString ( argument )
    If argument is Object:
      1. Let primValue be ? ToPrimitive(argument, hint String).
     ...
  
    ToPrimitive ( input [, PreferredType ])
     ...
      b. Else if PreferredType is hint String, let hint be "string".
     ...
      d. Let exoticToPrim be ? GetMethod(input, @@toPrimitive)
      e. If exoticToPrim is not undefined, then
        i. Let result be ? Call(exoticToPrim, input, « hint »).
        ii. If Type(result) is not Object, return result.
        iii. Throw a TypeError exception.
      f. If hint is "default", set hint to "number".
      g. Return ? OrdinaryToPrimitive(input, hint).
     ...
  
    OrdinaryToPrimitive( O, hint )
     ...
      3. If hint is "string", then
        a. Let methodNames be « "toString", "valueOf" ».
     ...
      5. For each name in methodNames in List order, do
        a. Let method be ? Get(O, name).
        b. If IsCallable(method) is true, then
          i. Let result be ? Call(method, O).
          ii. If Type(result) is not Object, return result.
     ...
  features: [string-trimming, String.prototype.trimStart, Symbol.toPrimitive]
  ---*/
  
  var toPrimitiveAccessed = 0;
  var toStringAccessed = 0;
  var valueOfAccessed = 0;
  var thisVal = {
    get [Symbol.toPrimitive]() {
      toPrimitiveAccessed += 1;
      return undefined;
    },
    get toString() {
      toStringAccessed += 1;
      return function() {
        return ' 42';
      };
    },
    get valueOf() {
      valueOfAccessed += 1;
      return function() {
        return '';
      };
    },
  };
  
  // Test that toString is called when Symbol.toPrimitive is undefined.
  
  var result = String.prototype.trimStart.call(thisVal)
  
  assert.sameValue(
    toPrimitiveAccessed,
    1,
    'thisVal.toString expected to have been accessed.'
  );
  assert.sameValue(
    result,
    '42',
    'thisVal.toString expected to have been called.'
  );
  
  // Test that thisVal[toPrimitive] has been accessed.
  
  assert.sameValue(
    toPrimitiveAccessed,
    1,
    'thisVal[Symbol.toPrimitive should have been accessed.'
  );
  
  // Test that thisVal.valueOf has not been accessed.
  
  assert.sameValue(
    valueOfAccessed,
    0,
    'thisVal.valueOf should not have been accessed.'
  );
  