<commit_before>"use strict";

var expect = require( "chai" ).expect,
    utils = require( "../utils.js" ),
    Template = require( "../../lib/private/Template.js" );

/*eslint camelcase:0 */
describe( "private / Templates ＜テンプレートの操作を管理するクラス＞", function(){

    var testTemplateId = "/Templates/base.tmpl",
        testTemplateFilePath = "./.tmp/utf8/Templates/base.tmpl";

    before( utils.prepareSampleFiles );
    after( utils.deleteSampleFiles );

    describe( "Constructor( id, pathToTemplateFile )", function(){
        it( "管理対象のテンプレートのIDとファイルの格納場所を、引数で受け取る。", function(){
            var template = new Template( testTemplateId, testTemplateFilePath );
            expect( template.id ).to.equal( testTemplateId );
            expect( template.path ).to.equal( testTemplateFilePath );
        } );
    } );

    describe( "init()", function(){

        it( "管理対象のテンプレートファイルを読み込み、テンプレート処理用に変換し、コード生成メソッドを初期化する。", function( done ){
            ( new Template( testTemplateId, testTemplateFilePath ) ).init().done( function( template ){
                expect( template.processor ).to.be.a( "function" );
                done();
            } );
        } );
    } );

    describe( "pickOutDefaultValues()", function(){

        var template;

        before( function( done ){
            template = new Template( testTemplateId, testTemplateFilePath );
            template.init().done( function(){ done(); } );
        } );

        describe( "管理対象のテンプレートファイルから、テンプレートへの適用対象となるデフォルト値を抽出し、オブジェクトとして返却する。", function(){

            describe( "Editable 編集可能領域", function(){
                it( "TemplateBeginEditable", function(){
                    expect( template.pickOutDefaultValues( '<!-- TemplateBeginEditable name="main" -->MAIN_DEFAULT<!-- TemplateEndEditable -->' ) )
                        .to.eql( { main: "MAIN_DEFAULT" } );
                } );

                it( "InstanceBeginEditable（親テンプレートで定義）", function(){
                    expect( template.pickOutDefaultValues( '<!-- InstanceBeginEditable name="sub" -->SUB_DEFAULT<!-- InstanceEndEditable -->' ) )
                        .to.eql( { sub: "SUB_DEFAULT" } );
                } );


                it( "リソースファイルへのパス記述は、ユーティリティ関数（__normalizePath__）を経由する表現に変換される。", function(){
                    expect( template.pickOutDefaultValues( '<!-- TemplateBeginEditable name="main" --><a href="hogehoge/index.html">hogehoge</a><!-- TemplateEndEditable -->' ) )
                        .to.have.property( "main" )
                        .and.match( /<a href="<%- __normalizePath__\( ".+hogehoge(\/|\\\\)index.html" \) %>">hogehoge<\/a>/ );
                } );

                describe( "BeginEditableの入れ子", function(){
                    it( "基本的に、Instance/Templateを問わず全ての値が抽出される。", function(){
                        expect( template.pickOutDefaultValues( [
                            '<!-- InstanceBeginEditable name="main" -->',
                            'PARENT_VALUE',
                            '<!-- TemplateBeginEditable name="sub1" -->SUB_1_VALUE<!-- TemplateEndEditable -->',
                            '<!-- InstanceEndEditable -->'
                        ].join( "" ) ) )
                            .to.eql( {
                                main: "PARENT_VALUE<!-- TemplateBeginEditable name=\"sub1\" -->SUB_1_VALUE<!-- TemplateEndEditable -->",
                                sub1: "SUB_1_VALUE"
                            } );
                    } );

                    it( "同名の場合は、内側の値が採用される。", function(){
                        expect( template.pickOutDefaultValues( [
                            '<!-- InstanceBeginEditable name="main" -->',
                            'PARENT_VALUE',
                            '<!-- TemplateBeginEditable name="main" -->SELF_VALUE<!-- TemplateEndEditable -->',
                            '<!-- InstanceEndEditable -->'
                        ].join( "" ) ) )
                            .to.eql( { main: "SELF_VALUE" } );
                    } );
                } );

                describe( "各種の文字列", function(){
                    it( "日本語の文字列も、そのまま抽出できる。", function(){
                        var testStr = "ノン・アスキーの文字列";
                        expect( template.pickOutDefaultValues( '<!-- InstanceBeginEditable name="test" -->' + testStr + '<!-- InstanceEndEditable -->' ) )
                            .to.eql( { test: testStr } );
                    } );

                    it( "特殊文字も、そのまま抽出できる。", function(){
                        var testStr = "<p>&copy;&amp;&trade;</p>";
                        expect( template.pickOutDefaultValues( '<!-- InstanceBeginEditable name="test" -->' + testStr + '<!-- InstanceEndEditable -->' ) )
                            .to.eql( { test: testStr } );
                    } );

                    it( "<!-- comment -->", function(){
                        var testStr = "<!-- comment -->";
                        expect( template.pickOutDefaultValues( '<!-- InstanceBeginEditable name="test" -->' + testStr + '<!-- InstanceEndEditable -->' ) )
                            .to.eql( { test: testStr } );
                    } );

                    it( "&lt;!-- not comment --&gt;", function(){
                        var testStr = "&lt;!-- not comment --&gt;";
                        expect( template.pickOutDefaultValues( '<!-- InstanceBeginEditable name="test" -->' + testStr + '<!-- InstanceEndEditable -->' ) )
                            .to.eql( { test: testStr } );
                    } );
                } );
            } );
        } );
    } );

    describe( "convertToTemplateFormat( HTMLCode )", function(){<commit_msg>特殊文字のテストを手厚くした。<commit_after>"use strict";

var expect = require( "chai" ).expect,
    utils = require( "../utils.js" ),
    Template = require( "../../lib/private/Template.js" );

/*eslint camelcase:0 */
describe( "private / Templates ＜テンプレートの操作を管理するクラス＞", function(){

    var testTemplateId = "/Templates/base.tmpl",
        testTemplateFilePath = "./.tmp/utf8/Templates/base.tmpl";

    before( utils.prepareSampleFiles );
    after( utils.deleteSampleFiles );

    describe( "Constructor( id, pathToTemplateFile )", function(){
        it( "管理対象のテンプレートのIDとファイルの格納場所を、引数で受け取る。", function(){
            var template = new Template( testTemplateId, testTemplateFilePath );
            expect( template.id ).to.equal( testTemplateId );
            expect( template.path ).to.equal( testTemplateFilePath );
        } );
    } );

    describe( "init()", function(){

        it( "管理対象のテンプレートファイルを読み込み、テンプレート処理用に変換し、コード生成メソッドを初期化する。", function( done ){
            ( new Template( testTemplateId, testTemplateFilePath ) ).init().done( function( template ){
                expect( template.processor ).to.be.a( "function" );
                done();
            } );
        } );
    } );

    describe( "pickOutDefaultValues()", function(){

        var template;

        before( function( done ){
            template = new Template( testTemplateId, testTemplateFilePath );
            template.init().done( function(){ done(); } );
        } );

        describe( "管理対象のテンプレートファイルから、テンプレートへの適用対象となるデフォルト値を抽出し、オブジェクトとして返却する。", function(){

            describe( "Editable 編集可能領域", function(){
                it( "TemplateBeginEditable", function(){
                    expect( template.pickOutDefaultValues( '<!-- TemplateBeginEditable name="main" -->MAIN_DEFAULT<!-- TemplateEndEditable -->' ) )
                        .to.eql( { main: "MAIN_DEFAULT" } );
                } );

                it( "InstanceBeginEditable（親テンプレートで定義）", function(){
                    expect( template.pickOutDefaultValues( '<!-- InstanceBeginEditable name="sub" -->SUB_DEFAULT<!-- InstanceEndEditable -->' ) )
                        .to.eql( { sub: "SUB_DEFAULT" } );
                } );


                it( "リソースファイルへのパス記述は、ユーティリティ関数（__normalizePath__）を経由する表現に変換される。", function(){
                    expect( template.pickOutDefaultValues( '<!-- TemplateBeginEditable name="main" --><a href="hogehoge/index.html">hogehoge</a><!-- TemplateEndEditable -->' ) )
                        .to.have.property( "main" )
                        .and.match( /<a href="<%- __normalizePath__\( ".+hogehoge(\/|\\\\)index.html" \) %>">hogehoge<\/a>/ );
                } );

                describe( "BeginEditableの入れ子", function(){
                    it( "基本的に、Instance/Templateを問わず全ての値が抽出される。", function(){
                        expect( template.pickOutDefaultValues( [
                            '<!-- InstanceBeginEditable name="main" -->',
                            'PARENT_VALUE',
                            '<!-- TemplateBeginEditable name="sub1" -->SUB_1_VALUE<!-- TemplateEndEditable -->',
                            '<!-- InstanceEndEditable -->'
                        ].join( "" ) ) )
                            .to.eql( {
                                main: "PARENT_VALUE<!-- TemplateBeginEditable name=\"sub1\" -->SUB_1_VALUE<!-- TemplateEndEditable -->",
                                sub1: "SUB_1_VALUE"
                            } );
                    } );

                    it( "同名の場合は、内側の値が採用される。", function(){
                        expect( template.pickOutDefaultValues( [
                            '<!-- InstanceBeginEditable name="main" -->',
                            'PARENT_VALUE',
                            '<!-- TemplateBeginEditable name="main" -->SELF_VALUE<!-- TemplateEndEditable -->',
                            '<!-- InstanceEndEditable -->'
                        ].join( "" ) ) )
                            .to.eql( { main: "SELF_VALUE" } );
                    } );
                } );

                describe( "各種の文字列", function(){
                    it( "日本語の文字列も、そのまま抽出できる。", function(){
                        var testStr = "ノン・アスキーの文字列";
                        expect( template.pickOutDefaultValues( '<!-- InstanceBeginEditable name="test" -->' + testStr + '<!-- InstanceEndEditable -->' ) )
                            .to.eql( { test: testStr } );
                    } );

                    it( "特殊文字も、そのまま抽出できる。", function(){
                        var testStr = "<p>&copy;&#169;&#xA9;©&amp;&trade;</p>";
                        expect( template.pickOutDefaultValues( '<!-- InstanceBeginEditable name="test" -->' + testStr + '<!-- InstanceEndEditable -->' ) )
                            .to.eql( { test: testStr } );
                    } );

                    it( "<!-- comment -->", function(){
                        var testStr = "<!-- comment -->";
                        expect( template.pickOutDefaultValues( '<!-- InstanceBeginEditable name="test" -->' + testStr + '<!-- InstanceEndEditable -->' ) )
                            .to.eql( { test: testStr } );
                    } );

                    it( "&lt;!-- not comment --&gt;", function(){
                        var testStr = "&lt;!-- not comment --&gt;";
                        expect( template.pickOutDefaultValues( '<!-- InstanceBeginEditable name="test" -->' + testStr + '<!-- InstanceEndEditable -->' ) )
                            .to.eql( { test: testStr } );
                    } );
                } );
            } );
        } );
    } );

    describe( "convertToTemplateFormat( HTMLCode )", function(){
{'fraction_non_alphanumeric': 0.15730337078651685, 'fraction_numerical': 0.0017694417411306732, 'mean_word_length': 1.5159136434453595, 'pattern_counts': {'":': 0, '<': 69, '<?xml version=': 0, '>': 69, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7365674', 'n_tokens_mistral': 3408, 'n_tokens_neox': 3275, 'n_words': 501}