import { XmlParser, ParserEventType } from '.';
describe('XmlParser', () => {
	// Flavors:
	describe('Vanilla', () => {
		let last_element = null;
		let last_attrs = null;
		let last_data = null;
		let parser = null;
		beforeEach(() => {
			parser = new XmlParser(function (event) {
				switch (event.eventType) {
					case ParserEventType.StartElement:
						last_element = event.elementName;
						last_attrs = event.attributes;
						break;
					case ParserEventType.Text:
						last_data = event.data;
						break;
				}
			});
		});
		it('handles whitespace around attribute =', () => {
			parser.parse("");
			expect(last_element).toBe('TextField');
			expect(last_attrs['text']).toBe('hello');
		});
		it('resolves entities', () => {
			parser.parse('<>"&'');
			expect(last_data).toBe('<>"&\'');
		});
		it('resolves greek letter entities in attributes', () => {
			parser.parse("blah");
			expect(last_attrs.text).toBe('Ω');
		});
		it('resolves entities in element text', () => {
			parser.parse('Ω');
			expect(last_data).toBe('Ω');
		});
		it('resolves <> inside quotes', () => {
			parser.parse('\' blah="b"/>');
			expect(last_attrs.name).toBe('<&>');
			expect(last_attrs.blah).toBe('b');
		});
	});
	describe('Angular', () => {
		let last_element = null;
		let last_attrs = null;
		let parser = null;
		beforeEach(() => {
			parser = new XmlParser(function (event) {
				switch (event.eventType) {
					case ParserEventType.StartElement:
						last_element = event.elementName;
						last_attrs = event.attributes;
						break;
				}
			});
			parser.angularSyntax = true;
		});
		it('parses [property] binding', () => {
			parser.parse("");
			expect(last_element).toBe('TextField');
			expect(last_attrs['[text]']).toBe('somevar');
		});
		it('parses (event) binding', () => {
			parser.parse("");
			expect(last_element).toBe('TextField');
			expect(last_attrs['(tap)']).toBe('onTap(blah)');
		});
		it('parses (^event) binding', () => {
			parser.parse("");
			expect(last_element).toBe('TextField');
			expect(last_attrs['(^tap)']).toBe('onTap(blah)');
		});
		it('parses #id attribute', () => {
			parser.parse('');
			expect(last_element).toBe('TextField');
			expect(last_attrs['#firstName']).toBe('');
		});
		it('parses #id attribute followed by another', () => {
			parser.parse("");
			expect(last_element).toBe('TextField');
			expect(last_attrs['#firstName']).toBe('');
			expect(last_attrs['text']).toBe('Name');
		});
		it('detects equals without value', () => {
			parser.parse('');
			expect(last_attrs).toBeFalsy();
		});
		it('detects no equals with quoted value', () => {
			parser.parse("");
			expect(last_attrs).toBeFalsy();
		});
		it('detects unclosed tag after no value attribute', () => {
			parser.parse(' {
			parser.angularSyntax = false;
			parser.parse("");
			expect(last_attrs).toBeFalsy();
		});
	});
});