const swc = require("../../../");
const Visitor = require("../../../Visitor").default;

{
  const src = `
  'use strict';
  
  class Foo {
    foo() {}
  }
  
  class Bar extends Foo {
    foo() {
      super.foo();
    }
    async bar() {}
  }
  
  class Baz extends Bar {
    foo() {
      super.foo();
      this.baz()
    }
    baz() {
  
    }
    async other() {
      this.baz()
      await super.bar()
    }
  }
  
  function red( color )
  {
      let foo = 3.14;
      return color >> 16;
  }
  
  function green( color )
  {
      return ( color >> 8 ) & 0xFF;
  }
  
  /**
   * Extract blue color out of a color integer:
   *
   * 0x00DEAD -> 0xAD
   *
   * @param  {Number} color
   * @return {Number}
   */
  function blue( color )
  {
      return color & 0xFF;
  }
  
  function intToHex( int )
  {
      const mask = '#000000';
  
      const hex = int.toString( 16 );
  
      return mask.substring( 0, 7 - hex.length ) + hex;
  }
   
  function hexToInt( hex )
  {
      return parseInt( hex.substring( 1 ), 16 );
  }


  // Verify that visitor can handle class declaration.
  class Prent {}
  class Child extends Parent {}
  

  // Verify that visitor can handle new expression.
  new Child(foo);
  new Child(...foo);


  // Verify that visitor can handle call expressions.
  call(...foo);
  call(foo);

  let arr = [elem, , ...foo];

  module.exports = {
      red,
      green,
      blue,
      intToHex,
      hexToInt,
  };
  `;

  it("works", () => {
    swc.transformSync(src, {
      plugin: m => m
    });
  });

  it("works with visitor", () => {
    swc.transformSync(src, {
      plugin: m => {
        let v = new Visitor();
        return v.visitProgram(m);
      }
    });
  });
}
