/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
import chai from 'chai'
import sinon from 'sinon'
import sinonChai from 'sinon-chai'
const { expect } = chai
chai.use(sinonChai)

import * as shared from '../../../shared'

describe('a polyfill of', () => {
  it('Promise', () => {
    expect(typeof Promise).to.be.equal('function')
    expect(() => {
      new Promise(sinon.spy()).then(sinon.spy())
      Promise.all()
      Promise.race()
      Promise.resolve()
      Promise.reject()
    }).to.not.throw
  })

  it('Object.assign', () => {
    expect(typeof Object.assign).to.be.equal('function')
  })

  it('setTimeout', () => {
    expect(typeof setTimeout).to.be.equal('function')
  })

  it('console.log', () => {
    expect(typeof console.log).to.be.equal('function')
  })
})

describe('freeze the prototype of build-in objects', function () {
  before(() => {
    shared.freezePrototype()
  })

  it('Object & Object.prototype', () => {
    expect(Object).to.be.frozen
    // expect(Object.prototype).to.be.frozen
  })
  it('Array & Array.prototype', () => {
    expect(Array).to.be.frozen
    expect(Array.prototype).to.be.frozen
  })

  it('String.prototype', () => { expect(String.prototype).to.be.frozen })
  it('Number.prototype', () => { expect(Number.prototype).to.be.frozen })
  it('Boolean.prototype', () => { expect(Boolean.prototype).to.be.frozen })
  it('Error.prototype', () => { expect(Error.prototype).to.be.frozen })
  it('Date.prototype', () => { expect(Date.prototype).to.be.frozen })
  it('Math.prototype', () => { expect(Math.prototype).to.be.frozen })
  it('RegExp.prototype', () => { expect(RegExp.prototype).to.be.frozen })
})
