diff --git a/.gitignore b/.gitignore index 50602ac..5c764ab 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,6 @@ build/ # Directory created by dartdoc doc/api/ + +# File for running and testing independent code +testfile.dart \ No newline at end of file diff --git a/lib/src/unofficial_jisho_api_base.dart b/lib/src/unofficial_jisho_api_base.dart index 54a5904..7970bfe 100644 --- a/lib/src/unofficial_jisho_api_base.dart +++ b/lib/src/unofficial_jisho_api_base.dart @@ -8,9 +8,9 @@ final htmlUnescape = html_entities.HtmlUnescape(); // TODO: Put public facing types in this file. -const String JISHO_API = 'http://jisho.org/api/v1/search/words'; -const String SCRAPE_BASE_URI = 'http://jisho.org/search/'; -const String STROKE_ORDER_DIAGRAM_BASE_URI = 'http://classic.jisho.org/static/images/stroke_diagrams/'; +const String JISHO_API = 'https://jisho.org/api/v1/search/words'; +const String SCRAPE_BASE_URI = 'https://jisho.org/search/'; +const String STROKE_ORDER_DIAGRAM_BASE_URI = 'https://classic.jisho.org/static/images/stroke_diagrams/'; /* KANJI SEARCH FUNCTIONS START */ @@ -33,9 +33,9 @@ String uriForPhraseSearch(String phrase) { return '${JISHO_API}?keyword=${Uri.encodeComponent(phrase)}'; } -bool containsKanjiGlyph(pageHtml, String kanji) { +bool containsKanjiGlyph(String pageHtml, String kanji) { final kanjiGlyphToken = '

${kanji}

'; - return pageHtml.indexOf(kanjiGlyphToken) != -1; + return pageHtml.contains(kanjiGlyphToken); } String getStringBetweenIndicies(String data, int startIndex, int endIndex) { @@ -44,22 +44,22 @@ String getStringBetweenIndicies(String data, int startIndex, int endIndex) { } String getStringBetweenStrings(String data, String startString, String endString) { - final regex = RegExp('${RegExp.escape(startString)}(.*?)${RegExp.escape(endString)}'); - final match = regex.allMatches(data).toList(); + final regex = RegExp('${RegExp.escape(startString)}(.*?)${RegExp.escape(endString)}', dotAll: true); + final match = regex.allMatches(data).toList(); //TODO: Something wrong here - return match ?? match[1].toString(); + return match.isNotEmpty ? match[0].group(1).toString() : null; } -int getIntBetweenStrings(pageHtml, String startString, String endString) { +int getIntBetweenStrings(String pageHtml, String startString, String endString) { final stringBetweenStrings = getStringBetweenStrings(pageHtml, startString, endString); - return stringBetweenStrings ?? int.parse(stringBetweenStrings); + return int.parse(stringBetweenStrings); } List getAllGlobalGroupMatches(String str, RegExp regex) { var regexResults = regex.allMatches(str).toList(); - var results = []; + List results = []; for (var match in regexResults) { - results.add(match.toString().split(' ')[0]); + results.add(match.group(1)); } return results; @@ -70,20 +70,20 @@ List parseAnchorsToArray(String str) { return getAllGlobalGroupMatches(str, regex); } -List getYomi(pageHtml, String yomiLocatorSymbol) { +List getYomi(String pageHtml, String yomiLocatorSymbol) { final yomiSection = getStringBetweenStrings(pageHtml, '
${yomiLocatorSymbol}:
', ''); return parseAnchorsToArray(yomiSection ?? ''); } -List getKunyomi(pageHtml) { +List getKunyomi(String pageHtml) { return getYomi(pageHtml, KUNYOMI_LOCATOR_SYMBOL); } -List getOnyomi(pageHtml) { +List getOnyomi(String pageHtml) { return getYomi(pageHtml, ONYOMI_LOCATOR_SYMBOL); } -List getYomiExamples(pageHtml, String yomiLocatorSymbol) { +List getYomiExamples(String pageHtml, String yomiLocatorSymbol) { final locatorString = '

${yomiLocatorSymbol} reading compounds

'; final exampleSection = getStringBetweenStrings(pageHtml, locatorString, ''); if (exampleSection==null) { @@ -102,18 +102,18 @@ List getYomiExamples(pageHtml, String yomiLocatorSymbol) { ); }); - return examples; + return examples.toList(); } -List getOnyomiExamples(pageHtml) { +List getOnyomiExamples(String pageHtml) { return getYomiExamples(pageHtml, ONYOMI_LOCATOR_SYMBOL); } -List getKunyomiExamples(pageHtml) { +List getKunyomiExamples(String pageHtml) { return getYomiExamples(pageHtml, KUNYOMI_LOCATOR_SYMBOL); } -Radical getRadical(pageHtml) { +Radical getRadical(String pageHtml) { const radicalMeaningStartString = ''; const radicalMeaningEndString = ''; @@ -165,7 +165,7 @@ Radical getRadical(pageHtml) { return null; } -List getParts(pageHtml) { +List getParts(String pageHtml) { const partsSectionStartString = '
Parts:
'; const partsSectionEndString = ''; @@ -181,7 +181,7 @@ List getParts(pageHtml) { return (result); } -String getSvgUri(pageHtml) { +String getSvgUri(String pageHtml) { var svgRegex = RegExp('\/\/.*?.cloudfront.net\/.*?.svg/'); final regexResult = svgRegex.firstMatch(pageHtml).toString(); return regexResult ?? 'http:${regexResult}'; @@ -195,12 +195,12 @@ String getGifUri(String kanji) { return animationUri; } -int getNewspaperFrequencyRank(pageHtml) { +int getNewspaperFrequencyRank(String pageHtml) { final frequencySection = getStringBetweenStrings(pageHtml, '
', '
'); return frequencySection ?? int.parse(getStringBetweenStrings(frequencySection, '', '')); } -KanjiResult parseKanjiPageData(pageHtml, String kanji) { +KanjiResult parseKanjiPageData(String pageHtml, String kanji) { final result = KanjiResult(); result.query = kanji; result.found = containsKanjiGlyph(pageHtml, kanji); @@ -304,7 +304,7 @@ ExampleResultData parseExampleDiv(div) { return result; } -ExampleResults parseExamplePageData(pageHtml, String phrase) { +ExampleResults parseExamplePageData(String pageHtml, String phrase) { final document = xml.parse(pageHtml); final divs = document.descendants.where((node) => node.attributes[0].value == 'sentence_content').toList(); @@ -445,7 +445,7 @@ class JishoApi { /// @async searchForPhrase(String phrase) { final uri = uriForPhraseSearch(phrase); - return http.read(uri).then((response) => jsonDecode(response).data); + return http.get(uri).then((response) => jsonDecode(response.body).data); } /// Scrape the word page for a word/phrase. @@ -461,8 +461,8 @@ class JishoApi { Future scrapeForPhrase(String phrase) async { final uri = uriForPhraseScrape(phrase); try { - final response = await http.read(uri); - return parsePhrasePageData(jsonDecode(response).data, phrase); + final response = await http.get(uri); + return parsePhrasePageData(response.body, phrase); } catch (err) { if (err.response.status == 404) { return PhrasePageScrapeResult( @@ -481,7 +481,7 @@ class JishoApi { /// @async Future searchForKanji(String kanji) { final uri = uriForKanjiSearch(kanji); - return http.read(uri).then((response) => parseKanjiPageData(jsonDecode(response).data, kanji)); + return http.get(uri).then((response) => parseKanjiPageData(response.body, kanji)); } /// Scrape Jisho.org for examples. @@ -490,6 +490,6 @@ class JishoApi { /// @async Future searchForExamples(String phrase) { final uri = uriForExampleSearch(phrase); - return http.read(uri).then((response) => parseExamplePageData(jsonDecode(response).data, phrase)); + return http.get(uri).then((response) => parseExamplePageData(response.body, phrase)); } } \ No newline at end of file diff --git a/test/local_function_test_cases.dart b/test/local_function_test_cases.dart new file mode 100644 index 0000000..9efc3ed --- /dev/null +++ b/test/local_function_test_cases.dart @@ -0,0 +1,119 @@ +import 'package:unofficial_jisho_api/unofficial_jisho_api.dart'; +import 'package:test/test.dart'; + +import 'package:http/http.dart' as http; + +void test_local_functions() async { + + +/* KANJI SEARCH FUNCTION TESTS START */ + + test('removeNewLines', () { + final result = removeNewlines('Line \nwith\r\n Newlines and spaces\n'); + expect(result, 'Line with Newlines and spaces'); + }); + + test('uriForKanjiSearch', () { + final result = uriForKanjiSearch('時'); + expect(result, 'https://jisho.org/search/%E6%99%82%23kanji'); + }); + + test('getUriForStrokeOrderDiagram', () { + final result = getUriForStrokeOrderDiagram('時'); + expect(result, 'https://classic.jisho.org/static/images/stroke_diagrams/26178_frames.png'); + }); + + test('uriForPhraseSearch', () { + final result = uriForPhraseSearch('時間'); + expect(result, 'https://jisho.org/api/v1/search/words?keyword=%E6%99%82%E9%96%93'); + }); + + final kanjiPage = (await http.get('https://jisho.org/search/%E6%99%82%23kanji')).body; + + test('containsKanjiGlyph', () { + final result = containsKanjiGlyph(kanjiPage, '時'); + expect(result, true); + }); + + test('getStringBetweenIndicies', () { + final result = getStringBetweenIndicies('String\n\rwith\nNewlines', 3, 9); + expect(result, 'ingw'); + }); + + test('getStringBetweenStrings', () { + const data = 'STArT I want this string END'; + final result = getStringBetweenStrings(data, 'STArT', 'END'); + expect(result, ' I want this string '); + }); + + test('getIntBetweenStrings', () { + final result = getIntBetweenStrings(kanjiPage, '', ' strokes'); + expect(result, 10); + }); + + test('getAllGlobalGroupMatches', () { + + }); + + test('parseAnchorsToArray', () { + + }); + + test('getYomi', () { + final result = getYomi(kanjiPage, 'On'); + expect(result, ['ジ']); + + }); + + test('getKunyomi', () { + final result = getKunyomi(kanjiPage); + expect(result, ['とき', '-どき']); + }); + + test('getOnyomi', () { + final result = getOnyomi(kanjiPage); + expect(result, ['ジ']); + }); + + test('getYomiExamples', () { + final result = getYomiExamples(kanjiPage, 'Kun'); + expect(result, ['ジ']); //FIX + }); + + test('getOnomiExamples', () { + final result = getOnyomiExamples(kanjiPage); + expect(result, ['ジ']); //FIX + }); + + test('getKunyomiExamples', () { + final result = getKunyomiExamples(kanjiPage); + expect(result, ['ジ']); //FIX + }); + + test('getRadical', () { + + }); + + test('getParts', () { + + }); + + test('getSvgUri', () { + + }); + + test('getGifUri', () { + + }); + + test('getNewspaperFrequencyRank', () { + + }); + + test('parseKanjiPageData', () { + + }); + + /* KANJI SEARCH FUNCTION TESTS END */ + +} \ No newline at end of file diff --git a/test/unofficial_jisho_api_test.dart b/test/unofficial_jisho_api_test.dart index 14557cf..dca8ac6 100644 --- a/test/unofficial_jisho_api_test.dart +++ b/test/unofficial_jisho_api_test.dart @@ -3,6 +3,7 @@ import 'package:path/path.dart' as path; import 'dart:convert'; import 'package:unofficial_jisho_api/unofficial_jisho_api.dart'; +import 'local_function_test_cases.dart' show test_local_functions; import 'package:test/test.dart'; final jisho = JishoApi(); @@ -21,7 +22,7 @@ void runTestCases(List testCaseFiles, String apiFunction) async { switch(apiFunction) { case 'searchForKanji': { final result = await jisho.searchForKanji(testCase['query']); - expect(result, testCase['expectedResult']); + expect(result, jsonDecode(testCase['expectedResult'])); break; } case 'searchForExamples': { @@ -42,6 +43,8 @@ void runTestCases(List testCaseFiles, String apiFunction) async { void main() async { + await test_local_functions(); + await runTestCases(getFilePaths('kanji_test_cases'), 'searchForKanji'); await runTestCases(getFilePaths('example_test_cases'), 'searchForExamples');