tritask / tritask-vscode

Tritask実装。Visual Studio Code + Python
MIT License
1 stars 0 forks source link

テストコード #15

Closed stakiran closed 3 years ago

stakiran commented 3 years ago

lint にせよ refactoring にせよ、ガッと修正した後でも動くことをさっと確認したい。

サマリー

task

stakiran commented 3 years ago

どうやるんだろうなぁ。

やってることが基本的に

で、unittest 書きづらいんだよなぁ。

vscode.window.activeTextEditor にモック差し込んだりとかできたりする?

stakiran commented 3 years ago

いや、普通に「VSCode ウィンドウ新たに立ち上げて、a.trita 開いて、所定の操作させて、最後にカーソル位置やテキストの内容をgetしてassertする

↑ これできる気がする

stakiran commented 3 years ago

テストコード実行するたびにいちいちウィンドウ新たに立ち上がる感じ(GUIテスト)になるけど、それでも手作業よりははるかに良い。

stakiran commented 3 years ago

書くとしたら

日付が変わると並び順が変わるので、テスト時に毎回ゼロからデータをつくるようにする

stakiran commented 3 years ago

mocha 思い出す

mocha における describe it before beforeEach after afterEach の実行順序 - Qiita

テストコードは既に yo code のおかげで実行できるようになってる

少しおためし

import * as assert from 'assert';
import { describe, before, after, beforeEach, afterEach, it } from 'mocha';

import * as vscode from 'vscode';

// import * as myExtension from '../extension';

suite('Extension Test Suite', () => {
    before(() => {
        vscode.window.showInformationMessage('Start all tests.');
    });

    test('Sample test', () => {
        assert.strictEqual(-1, [1, 2, 3].indexOf(5));
        assert.strictEqual(-1, [1, 2, 3].indexOf(0));
    });
});

describe('describe1', () => {
    before(() => {
        console.log('before')
    });

    after(() => {
        console.log('after')
    });

    beforeEach(() => {
        console.log('before')
    });

    afterEach(() => {
        console.log('after')
    });

    it('test1', () => {
        assert.strictEqual(1, 100-98-1);
    });

    it('test2', () => {
        assert.strictEqual(2, 100-98);
    });

});

describe('describe2', () => {
    it('test3', () => {
        assert.strictEqual(1, 100-98-1);
    });
});
  Extension Test Suite
    √ Sample test
  describe1
2
before
    √ test1
after
before
    √ test2
2
after
  describe2
    √ test3
  4 passing (79ms)
stakiran commented 3 years ago

suite と test って何?describe や it じゃダメなの?

stakiran commented 3 years ago

Testing Extensions | Visual Studio Code Extension API

記述なさそう。たぶん単に「suite がスイート表してて、テストケースは test が使えるよ(mochaデフォの describe と it はわかりづらいけどこれならわかりやすいやろ?)」ってことかな

stakiran commented 3 years ago

うん、suite は describe の、test は it のシンタックスシュガーっぽい

stakiran commented 3 years ago

chaiは?

まあ assert あるし、いったんこれでいいか

stakiran commented 3 years ago

テストコードから test.trita(空ファイル) を開くには?

stakiran commented 3 years ago

VS Code API | Visual Studio Code Extension API

vscode.window.openNewFile() ← こんなんがあるはず

stakiran commented 3 years ago

開いたかどうか見れないんだが。

function pause(){
    const commandLine = "pause"
    exec(commandLine, (err) => {
        if(err){
            console.log(err);
        }
    });
}

function sleep(msec: number){
    setTimeout(() => {}, msec)
}

pause でも setTimeout でも構わず終了しやがる

stakiran commented 3 years ago

あとかれんとでぃれくとりもわからん。

        console.log(vscode.workspace.name)
        console.log(vscode.workspace.workspaceFolders)

undefined だし。まず workspace folder を開く必要がある?

stakiran commented 3 years ago

https://code.visualstudio.com/api/references/vscode-api#TextDocument

activeTextEditor.document.fileName で「untitled 1」まで取れた。

が、ディレクトリはないっぽいな。

今が src/test/suite/extension.test.ts なんだが、src を得るにはどうしたらいいんだ?

stakiran commented 3 years ago
        console.log(vscode.workspace.name)
        console.log(vscode.workspace.workspaceFolders)
        console.log(IDE.getEditor().document.fileName)
        console.log(vscode.workspace.asRelativePath('123')) // workspace folder とやらがないから 123 がそのまま帰る

その workspace folder のパスが知りたいんやが

stakiran commented 3 years ago

console.log(vscode.env.appRoot)

ちゃう。c:\Program Files\Microsoft VS Code\resources\app が出た。

……いや、実行時にここに各種ファイルがコピーされてくるから、ここ基点で進めればええってこと?

stakiran commented 3 years ago

いや、違うね

stakiran commented 3 years ago

今が src/test/suite/extension.test.ts なんだが、src を得るにはどうしたらいいんだ?

これが欲しい。src/test/suite/test.trita を開きたいんですけども……

stakiran commented 3 years ago
        console.log(vscode.env.appRoot)
        console.log(vscode.env.shell)
        console.log(vscode.workspace.name)
        console.log(vscode.workspace.workspaceFile)
        console.log(vscode.workspace.workspaceFolders)
        console.log(IDE.getEditor().document.fileName)
        console.log(IDE.getEditor().document.uri.fsPath)
        console.log(vscode.workspace.asRelativePath('123'))

マジで正解どれなん……?

stakiran commented 3 years ago

javascript - VS Code extension - get full path - Stack Overflow

ググってもこれしか出てこない。

その workspace folder が空なんですよ。

stakiran commented 3 years ago

.../src/test/suite/extension.test.ts を実行してるんだから、.../src/test/suite/ を得る手段が絶対あるはずだと思うんだが

stakiran commented 3 years ago

https://code.visualstudio.com/api/working-with-extensions/testing-extension#the-test-script

stakiran commented 3 years ago

path さんでしたか

console.log(path.resolve(__dirname))

d:\work\github\stakiran_sub\tritask-vscode-PUBLIC\tritask-language-features\out\test\suite

stakiran commented 3 years ago

だが out 側に test.trita などテスト用ファイルがない

stakiran commented 3 years ago

node.js で絶対パスや相対パスを取得する方法 npm __dirname

stakiran commented 3 years ago

やっとできた

image

stakiran commented 3 years ago
import * as path from 'path'

class Path {
    static get _entrypoint(){
        // __dirname には現在実行中のソースコードが格納されているディレクトリ.
        // node.js の動作.
        // src/test/suite/test.ts の場合, out/test/suite になる
        return path.resolve(__dirname)
    }

    static get root(){
        const defaultRoot = this._entrypoint
        return path.resolve(defaultRoot, '..', '..', '..', 'src', 'test', 'suite')
    }
}

わりかししんどい。 Path.root にあたるパスを一発で取得できるシステム変数があってもばちあたらんと思うが

stakiran commented 3 years ago

ソースコード extension.ts を import する方法がわからん……

import * as tritask from '../../../src/extension'

これだと型定義なくてダメ。

image

const tritask = require('../../../src/extension.ts')

これだと SyntaxError: Cannot use import statement outside a module

stakiran commented 3 years ago
// import * as myExtension from '../extension';

yo code のテンプレはこれを出してる

stakiran commented 3 years ago

ぐぐると「型が存在してない」的な内容がヒットする……

image

ちゃんと定義してんだけどなぁ。それとも <string>SELF_EXTENSION_ID= みたいにしてないから認識されてない?

stakiran commented 3 years ago

typescript わからんからわからん

stakiran commented 3 years ago

あ、export してないからだ

stakiran commented 3 years ago

あと console.log がダメ

Error: Cannot find module '../../../src/extension'
Require stack:
……
stakiran commented 3 years ago

ダメだぁ、歯が立たない。付け焼き刃だときっついなぁ。 https://code.visualstudio.com/api/references/vscode-api 程度の情報量だとわからん

stakiran commented 3 years ago

extention.ts

 export {
     getSelfDirectory
 }

extention.test.ts

import * as tritask from '../../../src/extension';

        tritask.getSelfDirectory()

これでエラー無く通ったけど、デバッグコンソールに何も表示されなくなった……

stakiran commented 3 years ago

いや、エラー出てた(出たり出なかったりする)

Error: Cannot find module '../../../src/extension'
Require stack:
- d:\work\github\stakiran_sub\tritask-vscode-PUBLIC\tritask-language-features\out\test\suite\extension.test.js
- d:\work\github\stakiran_sub\tritask-vscode-PUBLIC\tritask-language-features\node_modules\mocha\lib\mocha.js
- d:\work\github\stakiran_sub\tritask-vscode-PUBLIC\tritask-language-features\node_modules\mocha\index.js
- d:\work\github\stakiran_sub\tritask-vscode-PUBLIC\tritask-language-features\out\test\suite\index.js
- c:\Program Files\Microsoft VS Code\resources\app\out\vs\loader.js
- c:\Program Files\Microsoft VS Code\resources\app\out\bootstrap-amd.js
- c:\Program Files\Microsoft VS Code\resources\app\out\bootstrap-fork.js
stakiran commented 3 years ago

わけわかんね

stakiran commented 3 years ago

https://code.visualstudio.com/api/references/vscode-api さんが import * as myExtension from '../extension の myExtension を使う例を書いてくれたらありがたいんだが

stakiran commented 3 years ago

どっか拡張機能のソースでも漁るかいね

stakiran commented 3 years ago

vscode-eslint

https://github.com/microsoft/vscode-eslint/blob/master/client/src/tests/glob.test.ts

stakiran commented 3 years ago
export function convert2RegExp(pattern: string): RegExp | undefined {
    const separator = process.platform === 'win32' ? '\\\\' : '\\/';
    const fileChar = `[^${separator}]`;
    function convertNode(node: Node): string {

なるほど、外から使わせたい関数は export つけて定義しちゃうのか(まあ当たり前か

stakiran commented 3 years ago

ダメっす

import { getSelfDirectory } from '../../../src/extension';

        getSelfDirectory()

Error: Cannot find module '../../../src/extension'

これが出る

stakiran commented 3 years ago

Cong! :smile:

import { getSelfDirectory } from '../../extension'; // ★ ../../../src/extension だとなぜかダメ(VSCode 上ではエラー出なかったのに)
        console.log(getSelfDirectory())

.. 入りの相対パスは「最低限の長さ」で書くべきってことかな。

たぶん node,js だか vscode だがのそのへんのパスの組み立て処理が(無駄に .. を重ねる書き方に)対応してない。

stakiran commented 3 years ago

https://github.com/tritask/tritask-vscode/commit/5aa2f7b0bd3406a28046cca511ee32501bd9d671

ほい、テスト用ファイル開くワンパスできた(長かった……

stakiran commented 3 years ago

vscode.workspace.openTextDocument(TESTEE_FULLLPATH) 失敗したときってどうやって検出するん?

Thenable とのことだが、catch() 書くとエラーになる。

stakiran commented 3 years ago

ああ、そうだった、普通に onfulfilled と onrejected を並べて定義すればいいだけだった

image

then().catch() の書き方しか使ってなかったから

stakiran commented 3 years ago

非同期の書き方しないとあかんな

stakiran commented 3 years ago

https://code.visualstudio.com/api/working-with-extensions/testing-extension#custom-setup-with-vscodetest

async function main() {
  try {
    // ★ここでテストコードのファイルパスつくって
    const extensionDevelopmentPath = path.resolve(__dirname, '../../../');
    const extensionTestsPath = path.resolve(__dirname, './suite/index');
    const vscodeExecutablePath = await downloadAndUnzipVSCode('1.40.1');
    const cliPath = resolveCliPathFromVSCodeExecutablePath(vscodeExecutablePath);

……

    // ★ここで指定して
    await runTests({
      // Use the specified `code` executable
      vscodeExecutablePath,
      extensionDevelopmentPath,
      extensionTestsPath
    });
  } catch (err) {
    console.error('Failed to run tests');
    process.exit(1);
  }
}

// ★async function を呼び出す形にする
main();
stakiran commented 3 years ago

いや、これは単に main() の中が終わるまで待ってるってだけか

stakiran commented 3 years ago

suite() や test() 使ってる中で、async await で制御していきたいんだが