/* ***** BEGIN LICENSE BLOCK *****
	Copyright (c) 2018-2020 Famibee (famibee.blog38.fc2.com)

	This software is released under the MIT License.
	http://opensource.org/licenses/mit-license.php
** ***** END LICENSE BLOCK ***** */

import assert = require('power-assert');

import {AnalyzeTagArg} from '../core/src/sn/AnalyzeTagArg';

context('class AnalyzeTagArg', ()=>{
	let alz;
	beforeEach(()=> {
		alz = new AnalyzeTagArg();
	});
	describe('Tst', ()=> {
		it('Arg0', ()=> {
			alz.go("");
			assert.equal(isHashEmpty(alz.hPrm), true);
			assert.equal(alz.isKomeParam, false);
		});
		function isHashEmpty(h: object): boolean {
				let c = 0, i;
				for (i in h) ++c;
				return c == 0;
			}
		it('Arg1', ()=>{
			alz.go("8");
			assert.equal(alz.hPrm['8'].val, true);
			assert.equal(alz.hPrm['8'].def, undefined);
		});


		it('Arg20', ()=> {
			alz.go("*");
			assert.equal(isHashEmpty(alz.hPrm), true);
			assert.equal(alz.isKomeParam, true);
		});
		it('Arg21', ()=> {
			alz.go("* ");
			assert.equal(isHashEmpty(alz.hPrm), true);
			assert.equal(alz.isKomeParam, true);
		});


		it('Arg40', ()=> {
			alz.go("a=3");
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['a'].val, "3");
			assert.equal(alz.hPrm['a'].def, undefined);
			assert.equal(alz.isKomeParam, false);
		});
		it('Arg41', ()=> {
			alz.go("a =3");
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['a'].val, "3");
			assert.equal(alz.hPrm['a'].def, undefined);
			assert.equal(alz.isKomeParam, false);
		});
		it('Arg42', ()=> {
			alz.go("a= 3");
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['a'].val, "3");
			assert.equal(alz.hPrm['a'].def, undefined);
			assert.equal(alz.isKomeParam, false);
		});
		it('Arg43', ()=> {
			alz.go("a = 3");
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['a'].val, "3");
			assert.equal(alz.hPrm['a'].def, undefined);
			assert.equal(alz.isKomeParam, false);
		});
	/*	it('Arg44', ()=> {
			"sys:a=4.5");
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm["sys:a"].val, "4.5");
			assert.equal(alz.hPrm["sys:a"].def, undefined);
			assert.equal(alz.isKomeParam, false);
		});*/

		it('Arg45', ()=> {
			alz.go("a='2009'");
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['a'].val, "2009");
			assert.equal(alz.hPrm['a'].def, undefined);
			assert.equal(alz.isKomeParam, false);
		});
		it('Arg46', ()=> {
			alz.go('a="2009"');
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['a'].val, "2009");
			assert.equal(alz.hPrm['a'].def, undefined);
			assert.equal(alz.isKomeParam, false);
		});
		it('Arg47', ()=> {
			alz.go("a=#2009#");
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['a'].val, "2009");
			assert.equal(alz.hPrm['a'].def, undefined);
			assert.equal(alz.isKomeParam, false);
		});

		it('Arg50', ()=> {
			alz.go(' name="_submenu.png" visible=false');
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['name'].val, "_submenu.png");
			assert.equal(alz.hPrm['name'].def, undefined);
			assert.equal(alz.hPrm['visible'].val, "false");
			assert.equal(alz.hPrm['visible'].def, undefined);
			assert.equal(alz.isKomeParam, false);
		});


		it('Arg60', ()=> {
			alz.go("a=%bar");
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['a'].val, "%bar");
			assert.equal(alz.hPrm['a'].def, undefined);
			assert.equal(alz.isKomeParam, false);
		});
		it('Arg61', ()=> {
			alz.go("a=%bar|ref");
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['a'].val, "%bar");
			assert.equal(alz.hPrm['a'].def, "ref");
			assert.equal(alz.isKomeParam, false);
		});
		it('Arg62', ()=> {
			alz.go("a=%bar|'うひょー'");
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['a'].val, "%bar");
			assert.equal(alz.hPrm['a'].def, "うひょー");
			assert.equal(alz.isKomeParam, false);
		});
		it('Arg63', ()=> {
			alz.go("a=%bar|'う ひょー'");
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['a'].val, "%bar");
			assert.equal(alz.hPrm['a'].def, "う ひょー");
			assert.equal(alz.isKomeParam, false);
		});

		it('Arg_val60', ()=> {
			alz.goVal("%bar");
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['val'], "%bar");
			assert.equal(alz.hPrm['def'], undefined);
		});
		it('Arg_val61', ()=> {
			alz.goVal("%bar|ref");
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['val'], "%bar");
			assert.equal(alz.hPrm['def'], "ref");
		});
		it('Arg_val62', ()=> {
			alz.goVal("%bar|'うひょー'");
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['val'], "%bar");
			assert.equal(alz.hPrm['def'], "うひょー");
		});
		it('Arg_val63', ()=> {
			alz.goVal("%bar|'う ひょー'");
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['val'], "%bar");
			assert.equal(alz.hPrm['def'], "う ひょー");
		});
		it('Arg_val64', ()=> {
			alz.goVal("mp:h|const.flash.display.Stage.stageHeight -40*2");	// 空白が入っていても許す
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['val'], "mp:h");
			assert.equal(alz.hPrm['def'], "const.flash.display.Stage.stageHeight -40*2");
		});
		it('Arg_val65', ()=> {
			alz.goVal('mp:h|"const.flash.display.Stage.stageHeight -40*2"');
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['val'], "mp:h");
			assert.equal(alz.hPrm['def'], "const.flash.display.Stage.stageHeight -40*2");
		});
		it('Arg_val66', ()=> {
			alz.goVal(' (pos.c + pos.l) /2');
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['val'], "(pos.c + pos.l) /2");
			assert.equal(alz.hPrm['def'], undefined);
		});
		it('Arg_val67', ()=> {
			alz.goVal('""');
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['val'], "");
			assert.equal(alz.hPrm['def'], undefined);
		});
		it('Arg_val68', ()=> {
			alz.goVal("''");
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['val'], "");
			assert.equal(alz.hPrm['def'], undefined);
		});

		it('Arg_val2bug0', ()=> {
			alz.goVal("mp:w|17");
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['val'], "mp:w");
			assert.equal(alz.hPrm['def'], "17");
		});
		it('Arg_val2bug1', ()=> {
			alz.goVal("26|17");
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['val'], "26");
			assert.equal(alz.hPrm['def'], "17");
		});

		it('Arg44_bug0', ()=> {
			alz.go("text=&sys:_album.img.渡り廊下・桜昼");
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm["text"].val, "&sys:_album.img.渡り廊下・桜昼");
			assert.equal(alz.hPrm["text"].def, undefined);
			assert.equal(alz.isKomeParam, false);
		});
		it('Arg44_bug1', ()=> {
			alz.go('* x=0 y=1 pic="渡り廊下・桜昼" cond=sys:_album.img.渡り廊下・桜昼');
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['x'].val, "0");
			assert.equal(alz.hPrm['x'].def, undefined);
			assert.equal(alz.hPrm['y'].val, "1");
			assert.equal(alz.hPrm['y'].def, undefined);
			assert.equal(alz.hPrm['pic'].val, "渡り廊下・桜昼");
			assert.equal(alz.hPrm['pic'].def, undefined);
			assert.equal(alz.hPrm['cond'].val, "sys:_album.img.渡り廊下・桜昼");
			assert.equal(alz.hPrm['cond'].def, undefined);
			assert.equal(alz.isKomeParam, true);
		});
		it('Arg50_bug0', ()=> {
			alz.go('text=&-const.sn.config.window.width');
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['text'].val, "&-const.sn.config.window.width");
			assert.equal(alz.hPrm['text'].def, undefined);
			assert.equal(alz.isKomeParam, false);
		});


		it('Arg80', ()=> {
			alz.go("a=3 b='1327' ");
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['a'].val, "3");
			assert.equal(alz.hPrm['a'].def, undefined);
			assert.equal(alz.hPrm['b'].val, "1327");
			assert.equal(alz.hPrm['b'].def, undefined);
			assert.equal(alz.isKomeParam, false);
		});
		it('Arg81', ()=> {
			alz.go('name="fcol" text=%fcol|&0x000000');
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['name'].val, "fcol");
			assert.equal(alz.hPrm['name'].def, undefined);
			assert.equal(alz.hPrm['text'].val, "%fcol");
			assert.equal(alz.hPrm['text'].def, "&0x000000");
			assert.equal(alz.isKomeParam, false);
		});
		it('Arg82', ()=> {
			alz.go('* layer="me s" page=%page|back visible=%visible|"tr ue" b_left=&l b_top=0 b_width=&w b_height=&const.flash.display.Stage.stageHeight b_color=%b_color|"0xffffff" b_alpha=%b_alpha|&sys:TextLayer.Back.Alpha r_size=12 max_col=25 bura_col=2 max_row=7');
			assert.equal(isHashEmpty(alz.hPrm), false);

			assert.equal(alz.hPrm['layer'].val, "me s");
			assert.equal(alz.hPrm['layer'].def, undefined);
			assert.equal(alz.hPrm['page'].val, "%page");
			assert.equal(alz.hPrm['page'].def, "back");
			assert.equal(alz.hPrm['visible'].val, "%visible");
			assert.equal(alz.hPrm['visible'].def, "tr ue");

			assert.equal(alz.hPrm['b_left'].val, "&l");
			assert.equal(alz.hPrm['b_left'].def, undefined);
			assert.equal(alz.hPrm['b_top'].val, "0");
			assert.equal(alz.hPrm['b_top'].def, undefined);
			assert.equal(alz.hPrm['b_width'].val, "&w");
			assert.equal(alz.hPrm['b_width'].def, undefined);
			assert.equal(alz.hPrm['b_height'].val, "&const.flash.display.Stage.stageHeight");
			assert.equal(alz.hPrm['b_height'].def, undefined);

			assert.equal(alz.hPrm['b_color'].val, "%b_color");
			assert.equal(alz.hPrm['b_color'].def, "0xffffff");
			assert.equal(alz.hPrm['b_alpha'].val, "%b_alpha");
			assert.equal(alz.hPrm['b_alpha'].def, "&sys:TextLayer.Back.Alpha");

			assert.equal(alz.hPrm['r_size'].val, "12");
			assert.equal(alz.hPrm['r_size'].def, undefined);
			assert.equal(alz.hPrm['max_col'].val, "25");
			assert.equal(alz.hPrm['max_col'].def, undefined);
			assert.equal(alz.hPrm['bura_col'].val, "2");
			assert.equal(alz.hPrm['bura_col'].def, undefined);
			assert.equal(alz.hPrm['max_row'].val, "7");
			assert.equal(alz.hPrm['max_row'].def, undefined);

			assert.equal(alz.isKomeParam, true);
		});
		it('Arg83', ()=> {
			alz.go("layout=#&'" + 'lineHeight="36" justificationRule="space" columnGap="0" paddingLeft="$pl" paddingTop="$pt" paddingRight="$pr" paddingBottom="$pb" verticalAlign="inherit" blockProgression="rl" lineBreak="explicit" fontLookup="embeddedCFF" renderingMode="cff" fontSize="24" locale="ja" kerning="off" trackingRight="0" color="$fcol" whiteSpaceCollapse="preserve"' + "'#");
			assert.equal(isHashEmpty(alz.hPrm), false);
			assert.equal(alz.hPrm['layout'].val, "&'" + 'lineHeight="36" justificationRule="space" columnGap="0" paddingLeft="$pl" paddingTop="$pt" paddingRight="$pr" paddingBottom="$pb" verticalAlign="inherit" blockProgression="rl" lineBreak="explicit" fontLookup="embeddedCFF" renderingMode="cff" fontSize="24" locale="ja" kerning="off" trackingRight="0" color="$fcol" whiteSpaceCollapse="preserve"' + "'");
			assert.equal(alz.hPrm['layout'].def, undefined);
			assert.equal(alz.isKomeParam, false);
		});


		it('20200416_test_multiline_arg0', ()=> {
			alz.go(
`	page=fore	;===
	text="]"

	layer=mes
class=txt
		abc
		def	;=====
		ghi;=====
		jkl
	=
		'color="0xaaaaaa"'
;`);
			assert.equal(isHashEmpty(alz.hPrm), false);

			assert.equal(alz.hPrm['layer'].val, `mes`);
			assert.equal(alz.hPrm['layer'].def, undefined);
			assert.equal(alz.hPrm['page'].val, 'fore');
			assert.equal(alz.hPrm['page'].def, undefined);
			assert.equal(alz.hPrm['text'].val, `]`);
			assert.equal(alz.hPrm['text'].def, undefined);
			assert.equal(alz.hPrm['class'].val, `txt`);
			assert.equal(alz.hPrm['class'].def, undefined);
			assert.equal(alz.hPrm['abc'].val, true);
			assert.equal(alz.hPrm['abc'].def, undefined);
			assert.equal(alz.hPrm['def'].val, true);
			assert.equal(alz.hPrm['def'].def, undefined);
			assert.equal(alz.hPrm['ghi'].val, true);
			assert.equal(alz.hPrm['ghi'].def, undefined);
			assert.equal(alz.hPrm['jkl'].val, `color="0xaaaaaa"`);
			assert.equal(alz.hPrm['jkl'].def, undefined);

			assert.equal(alz.isKomeParam, false);
		});
		it('20200416_test_multiline_arg1', ()=> {
			alz.go(
`	;=====
	layer=mes	;=====
class=txt	;======
	;=====
		layout;=====
	=	;"""""
'color="0xaaaaaa"'	;=====
text=%fcol|&0x000000;=====
txt=%fcol|'&0x000000';=====
a='2009';=====
b='#{fcol}'|true;=====`);
console.log(`fn:AnalyzeTagArg.test.ts line:347 alz.hPrm:%o`, alz.hPrm);
			assert.equal(isHashEmpty(alz.hPrm), false);

			assert.equal(alz.hPrm['layer'].val, `mes`);
			assert.equal(alz.hPrm['layer'].def, undefined);
			assert.equal(alz.hPrm['class'].val, `txt`);
			assert.equal(alz.hPrm['class'].def, undefined);
			assert.equal(alz.hPrm['layout'].val, `color="0xaaaaaa"`);
			assert.equal(alz.hPrm['layout'].def, undefined);
			assert.equal(alz.hPrm['text'].val, `%fcol`);
			assert.equal(alz.hPrm['text'].def, `&0x000000`);
			assert.equal(alz.hPrm['txt'].val, `%fcol`);
			assert.equal(alz.hPrm['txt'].def, `&0x000000`);
			assert.equal(alz.hPrm['a'].val, `2009`);
			assert.equal(alz.hPrm['a'].def, undefined);
			assert.equal(alz.hPrm['b'].val, `#{fcol}`);
			assert.equal(alz.hPrm['b'].def, `true`);

			assert.equal(alz.isKomeParam, false);
		});


	});

});
