Koan es6katas, 66: object-literal – getter

// 66: object-literal - getter
// To do: make all tests pass, leave the assert lines unchanged!

describe('An object literal can also contain getters', () => {

  it('just prefix the property with `get` (and make it a function)', function() {
    const obj = {
      get x(){ return 'ax'; }
      //x: function(){ return 'ax'; }()//Is the equivalent function
    };
    
    assert.equal(obj.x, 'ax');
  });

  it('must have NO parameters', function() {
    //Debe tener exactamente cero parametros
    const obj = {
      get x() { return 'ax'; }
    };
    
    assert.equal(obj.x, 'ax');
  });


  it('can be a computed property (an expression enclosed in `[]`)', function() {
    const keyName = 'ax';
    const obj = {
      get x() { return [keyName]; }
    };
    
    assert.equal(obj.x, 'ax');
  });

  it('can be removed using delete', function() {
    const obj = {
      get x() { return 'ax'; }
    };
    
    delete obj.x;
    
    assert.equal(obj.x, void 0);
  });

  // The following dont seem to work in the current transpiler version
  // but should be correct, as stated here https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get
  // It might be corrected later, new knowledge welcome.
  
  it('must not overlap with a pure property', function() {
    const obj = {
      ax: 1,
      get x() { return 'ax'; }
    };
    
    assert.equal(obj.x, 'ax');
  });
 
  it('multiple `get` for the same property are not allowed', function() {
   const obj = {
     bx: 1,
     get x() { return 'ax'; },
     get ax() { return 'ax1'; }
   };
   
   assert.equal(obj.x, 'ax');
 });
});

 

Exportar e Importar Funciones entre documentos en Javascript

Exportar:

romanNumerals.js

export function romanNumerals(){
        var numerals = [
            {value: 4, numeral: "IV"},
            {value: 1, numeral: "I"},
        ];

        function fromNumber(number) {
            var result = "";
            numerals.forEach(function (item) {
                for (; number >= item.value; number -= item.value) {
                    result += item.numeral;
                }

            });
            return result;
        };


        return {
            fromNumber,
        }
}

module.exports = romanNumerals;
export default function romanNumerals(){
        var numerals = [
            {value: 4, numeral: "IV"},
            {value: 1, numeral: "I"},
        ];

        function fromNumber(number) {
            var result = "";
            numerals.forEach(function (item) {
                for (; number >= item.value; number -= item.value) {
                    result += item.numeral;
                }

            });
            return result;
        };


        return {
            fromNumber,
        }
}

Importar:

spec.js

import romanNumerals from "../src/romanNumerals";

describe("test de prueba", function () {
    it("verdadero es verdadero", function () {
        expect(true).toBeTruthy();
    });

    it("converts numbers to Roman numerals", function () {
        expect(romanNumerals().fromNumber(1)).toBe("I");
        expect(romanNumerals().fromNumber(2)).toBe("II");
        expect(romanNumerals().fromNumber(3)).toBe("III");
        expect(romanNumerals().fromNumber(4)).toBe("IV");
        // expect(romanNumerals().fromNumber(2648)).toBe("MMDCXLVIII");
    });


});

 

 

Koan es6katas, 18: rest – as-parameter, Argumentos …rest,

Kata // 18: rest – as-parameter

// 18: rest - as-parameter
// To do: make all tests pass, leave the assert lines unchanged!

describe('rest in function params', () => {
    
  it('must be the last parameter', () => {
    const fn = (...rest) => {
      assert.deepEqual([1, 2], rest);
    };
    
    fn(1, 2);
  });
  
  it('can be used to get all other parameters', () => {
    const fn = (firstParam, secondParam, ...rest) => {
      assert.deepEqual([3,4], rest);
    };
    fn(null, 2, 3, 4);
  });
  
  it('makes `arguments` obsolete', () => {
    const fn = (...args) => {
      assert.deepEqual([42, 'twenty three', 'win'], args);
    };
    fn(42, 'twenty three', 'win');
  });
    
  it('eliminate `arguments`!!!', () => {
    const fn = (...args) =>{return args};
    const [firstArg, ...rest] = fn(1, 2, 3); //destructuring assignment 
    assert.deepEqual([2, 3], rest);
  });
    
});

Koan es6katas, 16: object-literal – computed properties

// 16: object-literal - computed properties
// To do: make all tests pass, leave the assert lines unchanged!

describe('Object literal properties may be computed values', () => {

  it('a computed property `x` needs to be surrounded by `[]`', () => {
    const propertyName = 'x';
    const obj = {[propertyName]: 1};
    assert.equal(obj.x, 1);
  });

  it('can also get a function assigned', () => {
    const key = 'func';
    const obj = {[key]: ()=> 'seven'};
    assert.equal(obj.func(), 'seven');
  });

  it('the key may also be the result of a function call', () => {
    const getName = () => 'propertyName';
    const obj = {[getName()]:() => {return 'seven'}};
    assert.equal(obj.propertyName(), 'seven');
  });

  it('the key can also be constructed by an expression', () => {
    const what = 'tyName';
    const obj = {['proper' + what]: true};
    assert.equal('propertyName' in obj, true);
  });

  xit('accessor keys can be computed names too', () => {
    const obj = {
      set ['key'](_) {return 1}
    };
    assert.equal(obj.key, 1);
  });
});

 

Multitarea con Máquina de Estados

Ejemplo de Avelino Herrera de Máquina de Estados:

Primera aproximación a realizarlo (L.Salas):

struct Blink {
  int pin;
  int timeOn;
  int timeOff;
  int estado;
  unsigned long relojAnt;
};
Blink blink1{ 3, 100, 100};
Blink blink2{ 6, 500, 300};
Blink blink3{ 9, 300, 500};
Blink blink4{12, 900, 200};

void setup() {
  Serial.begin(9600);
}

void loop() {
  parpadea(&blink1);
  parpadea(&blink2);
  parpadea(&blink3);
  parpadea(&blink4);
}

void parpadea(Blink *blink) {
  if (blink->estado == 0) {                      // Estado 0: es para inicializar
    pinMode(blink->pin, OUTPUT);
    digitalWrite(blink->pin, HIGH);
    blink->relojAnt = millis();
    blink->estado = 1;
  } else if (blink->estado == 1) {               // Estado 1: led on
    if (millis() - blink->relojAnt > blink->timeOn) {
      blink->relojAnt = millis();
      digitalWrite(blink->pin, LOW);
      blink->estado = 2;
    }
  } else if (blink->estado == 2) {               // Estado 2: led off
    if (millis() - blink->relojAnt > blink->timeOff) {
      blink->relojAnt = millis();
      digitalWrite(blink->pin, HIGH);
      blink->estado = 1;
    }
  }
}

 

Después del Refactor( Rubén Tejera):

enum State {Initialize, LedOn, LedOff};

struct Led {
  int pin;
  unsigned long timeFrameOn;
  unsigned long timeFrameOff;
  State actualState;
  unsigned long previusClock;
};

Led led1{ 3, 100, 100};
Led led2{ 6, 500, 300};
Led led3{ 9, 300, 500};
Led led4{12, 900, 200};

bool isTimeToChangeState(unsigned long previusTime, unsigned long rangeTime){
  return millis() - previusTime > rangeTime;
}

void setPreviusClock(Led *led){
  led->previusClock = millis();
}

void setState(Led *led, State newState){
  led->actualState = newState;
}

void setPinMode(int pin, bool type){
  pinMode(pin, type);
}

void setDigitalOutput(int pin, int newState){
  digitalWrite(pin, newState);
}

void switchOnLed(Led *led){
  setPreviusClock(led);
  setDigitalOutput(led->pin, HIGH);
  setState(led, LedOn);
}

void switchOffLed(Led *led){
  setPreviusClock(led);
  setDigitalOutput(led->pin, LOW);
  setState(led, LedOff);
}

void startLed(Led *led){
  setPinMode(led->pin, OUTPUT);
  switchOnLed(led);
}

void blink(Led *led) {
  switch ( led->actualState ){
    case Initialize:
      startLed(led);
      break;

    case LedOn:
      if (isTimeToChangeState(led->previusClock, led->timeFrameOn)) {
        switchOffLed(led);
      }
      break;

    case LedOff:
      if (isTimeToChangeState(led->previusClock, led->timeFrameOff)) {
        switchOnLed(led);
      }
      break;

    default:
      startLed(led);
      break;
  }
}

void setup() {
  Serial.begin(9600);
}

void loop() {
  blink(&led1);
  blink(&led2);
  blink(&led3);
  blink(&led4);
}