text: /// <reference types="cypress" />
  
  context('Cypress.Commands', () => {
  	beforeEach(() => {
  		cy.visit('https://example.cypress.io/cypress-api');
  	});
  
  	// https://on.cypress.io/custom-commands
  
  	it('.add() - create a custom command', () => {
  		Cypress.Commands.add(
  			'console',
  			{
  				prevSubject: true,
  			},
  			(subject, method) => {
  				// the previous subject is automatically received
  				// and the commands arguments are shifted
  
  				// allow us to change the console method used
  				method = method || 'log';
  
  				// log the subject to the console
  				// @ts-ignore TS7017
  				console[method]('The subject is', subject);
  
  				// whatever we return becomes the new subject
  				// we don't want to change the subject so
  				// we return whatever was passed in
  				return subject;
  			}
  		);
  
  		// @ts-ignore TS2339
  		cy.get('button')
  			.console('info')
  			.then(($button) => {
  				// subject is still $button
  			});
  	});
  });
  
  context('Cypress.Cookies', () => {
  	beforeEach(() => {
  		cy.visit('https://example.cypress.io/cypress-api');
  	});
  
  	// https://on.cypress.io/cookies
  	it('.debug() - enable or disable debugging', () => {
  		Cypress.Cookies.debug(true);
  
  		// Cypress will now log in the console when
  		// cookies are set or cleared
  		cy.setCookie('fakeCookie', '123ABC');
  		cy.clearCookie('fakeCookie');
  		cy.setCookie('fakeCookie', '123ABC');
  		cy.clearCookie('fakeCookie');
  		cy.setCookie('fakeCookie', '123ABC');
  	});
  
  	it('.preserveOnce() - preserve cookies by key', () => {
  		// normally cookies are reset after each test
  		cy.getCookie('fakeCookie').should('not.be.ok');
  
  		// preserving a cookie will not clear it when
  		// the next test starts
  		cy.setCookie('lastCookie', '789XYZ');
  		Cypress.Cookies.preserveOnce('lastCookie');
  	});
  
  	it('.defaults() - set defaults for all cookies', () => {
  		// now any cookie with the name 'session_id' will
  		// not be cleared before each new test runs
  		Cypress.Cookies.defaults({
  			preserve: 'session_id',
  		});
  	});
  });
  
  context('Cypress.arch', () => {
  	beforeEach(() => {
  		cy.visit('https://example.cypress.io/cypress-api');
  	});
  
  	it('Get CPU architecture name of underlying OS', () => {
  		// https://on.cypress.io/arch
  		expect(Cypress.arch).to.exist;
  	});
  });
  
  context('Cypress.config()', () => {
  	beforeEach(() => {
  		cy.visit('https://example.cypress.io/cypress-api');
  	});
  
  	it('Get and set configuration options', () => {
  		// https://on.cypress.io/config
  		let myConfig = Cypress.config();
  
  		expect(myConfig).to.have.property('animationDistanceThreshold', 5);
  		expect(myConfig).to.have.property('baseUrl', null);
  		expect(myConfig).to.have.property('defaultCommandTimeout', 4000);
  		expect(myConfig).to.have.property('requestTimeout', 5000);
  		expect(myConfig).to.have.property('responseTimeout', 30000);
  		expect(myConfig).to.have.property('viewportHeight', 660);
  		expect(myConfig).to.have.property('viewportWidth', 1000);
  		expect(myConfig).to.have.property('pageLoadTimeout', 60000);
  		expect(myConfig).to.have.property('waitForAnimations', true);
  
  		expect(Cypress.config('pageLoadTimeout')).to.eq(60000);
  
  		// this will change the config for the rest of your tests!
  		Cypress.config('pageLoadTimeout', 20000);
  
  		expect(Cypress.config('pageLoadTimeout')).to.eq(20000);
  
  		Cypress.config('pageLoadTimeout', 60000);
  	});
  });
  
  context('Cypress.dom', () => {
  	beforeEach(() => {
  		cy.visit('https://example.cypress.io/cypress-api');
  	});
  
  	// https://on.cypress.io/dom
  	it('.isHidden() - determine if a DOM element is hidden', () => {
  		let hiddenP = Cypress.$('.dom-p p.hidden').get(0);
  		let visibleP = Cypress.$('.dom-p p.visible').get(0);
  
  		// our first paragraph has css class 'hidden'
  		expect(Cypress.dom.isHidden(hiddenP)).to.be.true;
  		expect(Cypress.dom.isHidden(visibleP)).to.be.false;
  	});
  });
  
  context('Cypress.env()', () => {
  	beforeEach(() => {
  		cy.visit('https://example.cypress.io/cypress-api');
  	});
  
  	// We can set environment variables for highly dynamic values
  
  	// https://on.cypress.io/environment-variables
  	it('Get environment variables', () => {
  		// https://on.cypress.io/env
  		// set multiple environment variables
  		Cypress.env({
  			host: 'veronica.dev.local',
  			api_server: 'http://localhost:8888/v1/',
  		});
  
  		// get environment variable
  		expect(Cypress.env('host')).to.eq('veronica.dev.local');
  
  		// set environment variable
  		Cypress.env('api_server', 'http://localhost:8888/v2/');
  		expect(Cypress.env('api_server')).to.eq('http://localhost:8888/v2/');
  
  		// get all environment variable
  		expect(Cypress.env()).to.have.property('host', 'veronica.dev.local');
  		expect(Cypress.env()).to.have.property(
  			'api_server',
  			'http://localhost:8888/v2/'
  		);
  	});
  });
  
  context('Cypress.log', () => {
  	beforeEach(() => {
  		cy.visit('https://example.cypress.io/cypress-api');
  	});
  
  	it('Control what is printed to the Command Log', () => {
  		// https://on.cypress.io/cypress-log
  	});
  });
  
  context('Cypress.platform', () => {
  	beforeEach(() => {
  		cy.visit('https://example.cypress.io/cypress-api');
  	});
  
  	it('Get underlying OS name', () => {
  		// https://on.cypress.io/platform
  		expect(Cypress.platform).to.be.exist;
  	});
  });
  
  context('Cypress.version', () => {
  	beforeEach(() => {
  		cy.visit('https://example.cypress.io/cypress-api');
  	});
  
  	it('Get current version of Cypress being run', () => {
  		// https://on.cypress.io/version
  		expect(Cypress.version).to.be.exist;
  	});
  });
  
  context('Cypress.spec', () => {
  	beforeEach(() => {
  		cy.visit('https://example.cypress.io/cypress-api');
  	});
  
  	it('Get current spec information', () => {
  		// https://on.cypress.io/spec
  		// wrap the object so we can inspect it easily by clicking in the command log
  		cy.wrap(Cypress.spec).should('include.keys', [
  			'name',
  			'relative',
  			'absolute',
  		]);
  	});
  });
  