// Copyright (C) 2018 Kubilay Kahveci (Bloomberg LP). All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
desc: Valid PrivateName as private method
info: |
  ClassElement :
    MethodDefinition
    ...
    ;

  MethodDefinition :
    ClassElementName ( UniqueFormalParameters ) { FunctionBody }
    ...

  ClassElementName :
    PropertyName
    PrivateName

  PrivateName ::
    # IdentifierName

  IdentifierName ::
    IdentifierStart
    IdentifierName IdentifierPart

  IdentifierStart ::
    UnicodeIDStart
    $
    _
    \ UnicodeEscapeSequence

  IdentifierPart::
    UnicodeIDContinue
    $
    \ UnicodeEscapeSequence
    <ZWNJ> <ZWJ>

  UnicodeIDStart::
    any Unicode code point with the Unicode property "ID_Start"

  UnicodeIDContinue::
    any Unicode code point with the Unicode property "ID_Continue"

  NOTE 3
  The sets of code points with Unicode properties "ID_Start" and
  "ID_Continue" include, respectively, the code points with Unicode
  properties "Other_ID_Start" and "Other_ID_Continue".

template: productions
features: [class-methods-private, class-fields-private]
---*/

//- elements
#$_; #__; #\u{6F}_; #\u2118_; #ZW_\u200C_NJ_; #ZW_\u200D_J_;
#$() {
  return this.#$_;
}
#_() {
  return this.#__;
}
#\u{6F}() {
  return this.#\u{6F}_;
}
#\u2118() {
  return this.#\u2118_;
}
#ZW_\u200C_NJ() {
  return this.#ZW_\u200C_NJ_;
}
#ZW_\u200D_J() {
  return this.#ZW_\u200D_J_;
}

//- privateinspectionfunctions
$(value) {
  this.#$_ = value;
  return this.#$();
}
_(value) {
  this.#__ = value;
  return this.#_();
}
\u{6F}(value) {
  this.#\u{6F}_ = value;
  return this.#\u{6F}();
}
\u2118(value) {
  this.#\u2118_ = value;
  return this.#\u2118();
}
ZW_\u200C_NJ(value) {
  this.#ZW_\u200C_NJ_ = value;
  return this.#ZW_\u200C_NJ();
}
ZW_\u200D_J(value) {
  this.#ZW_\u200D_J_ = value;
  return this.#ZW_\u200D_J();
}

//- assertions
assert.sameValue(c.$(1), 1);
assert.sameValue(c._(1), 1);
assert.sameValue(c.\u{6F}(1), 1);
assert.sameValue(c.\u2118(1), 1);
assert.sameValue(c.ZW_\u200C_NJ(1), 1);
assert.sameValue(c.ZW_\u200D_J(1), 1);
