pyoo.js
Version:
A library for Python-style OO in JavaScript
219 lines (141 loc) • 5.14 kB
JavaScript
(function() {
;
var Classe = require('../src/pyoo.js');
var _ = require('lodash');
describe('Uma classe', function() {
it('deve ser declarada sem erros', function() {
expect(function() {
var CCobaia = Classe({
__init__: function(self) {
self.atributo_cobaia = 'valor de teste';
},
metodo_cobaia: function(self) {
console.log(self.atributo_cobaia);
}
});
}).not.toThrow();
});
it('não pode ser declarada sem argumentos', function() {
expect(function() {
Classe();
}).toThrowError('pyoo.js: Esperado object, obteve undefined.');
});
it('não pode ser declarada com um argumento que não seja object', function() {
var args = ['teste', 1, function() {}, -1, 4.678];
_(args).each(function(arg) {
expect(function() {
Classe(arg);
}).toThrowError('pyoo.js: Esperado object, obteve ' + (typeof arg) + '.');
});
expect(function() {
Classe([1,2]);
}).toThrowError('pyoo.js: Esperado object, obteve Array.');
expect(function() {
Classe(null);
}).toThrowError('pyoo.js: Esperado object, obteve null.');
});
it('deve ser instanciada sem erros', function() {
var CCobaia = Classe({
__init__: function(self) {
self.atributo_cobaia = 'valor de teste';
},
metodo_cobaia: function(self) {
console.log(self.atributo_cobaia);
}
});
expect(function() {
var icobaia = CCobaia();
}).not.toThrow();
});
it('deve possiblitar sua declaração sem uma função __init__', function() {
expect(function() {
Classe({
metodo: function(self) {}
});
}).not.toThrow();
});
it('deve possiblitar sua instanciação sem uma função __init__', function() {
expect(function() {
Classe({
metodo: function(self) {}
})();
}).not.toThrow();
});
it('deve possibilitar a invocação de métodos estáticos', function () {
const Entity = Classe({
randomId: (seed) => seed * 100
});
expect(Entity.randomId(3)).toBe(300);
});
// Essa restrição foi removida a fim de permitir métodos estáticos.
// it('não deve permitir, em sua declaração, métodos com menos de um argumento', function() {
// expect(function() {
// Classe({
// metodoParaDarErro: function() {}
// });
// }).toThrowError('pyoo.js: Um método deve aceitar, no mínimo, o argumento self.');
// });
});
describe('Uma instância de classe', function() {
var CCobaia = Classe({
__init__: function(self) {
self.atributo_cobaia = 'valor de teste';
},
metodo_cobaia: function(self) {
return (self.atributo_cobaia);
}
});
var icobaia = CCobaia();
it('deve existir', function() {
expect(icobaia).toBeDefined();
expect(icobaia).not.toBe(null);
});
it('deve conter as propriedades declaradas na classe', function() {
expect(icobaia.atributo_cobaia).toBeDefined();
expect(icobaia.metodo_cobaia).toBeDefined();
});
it('deve conter métodos que se comportem como esperado', function() {
expect(function() {
icobaia.metodo_cobaia();
}).not.toThrow();
expect(icobaia.metodo_cobaia()).toBeDefined();
expect(icobaia.metodo_cobaia()).toBe('valor de teste');
});
it('deve aceitar argumentos em __init__', function() {
var CCobaia = Classe({
__init__: function(self, a, b) {
self.c = a + b;
}
});
expect(function() {
CCobaia();
}).not.toThrow();
expect(CCobaia(4, 9)).toBeDefined();
expect(CCobaia(4, 9)).not.toBe(null);
expect(CCobaia(4, 9).c).toBeDefined();
expect(CCobaia(4, 9).c).toBe(13);
});
describe('declarada sem uma função __init__', function() {
var CCobaiaSemInit = Classe({
a: 1,
b: 2,
metodo: function(self) {
return self.a + self.b;
}
});
it('deve existir', function() {
expect(CCobaiaSemInit()).toBeDefined();
expect(CCobaiaSemInit()).not.toBe(null);
});
it('deve conter as propriedades definidas em sua declaração', function() {
var icobaiaSemInit = CCobaiaSemInit();
expect(icobaiaSemInit.a).toBeDefined();
expect(icobaiaSemInit.b).toBeDefined();
expect(icobaiaSemInit.metodo).toBeDefined();
expect(icobaiaSemInit.a).toBe(1);
expect(icobaiaSemInit.b).toBe(2);
expect(icobaiaSemInit.metodo()).toBe(3);
});
});
});
})();