This repository has been archived on 2024-03-18. You can view files and clone it, but cannot push or open issues or pull requests.
ishml/test/parser.js

130 lines
5.4 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const ishml = require('../ishml')
const assert = require('chai').assert
before(function() {
var lexicon = ishml.Lexicon()
lexicon
.register("взять")
.as({ key: "take", part: "verb", prepositions: ["у"] })
.register("отдать")
.as({ key: "give", part: "verb", prepositions: [] })
.register("кольцо")
.as({ key: "ring", part: "noun", role: "thing" })
.register("рубиновое")
.as({ key: "ring", part: "adjective", role: "thing" })
.register("мужчина", "мужчины", "мужчине")
.as({ key: "james", part: "noun", role: "npc" })
.register("женщина", "женщине")
.as({ key: "violet", part: "noun", role: "npc" })
.register("у", "от")
.as({ key: "from", part: "preposition" })
.register("и",",",";")
.as({ part: "conjunction" })
.register("его", "её", "ему")
.as({ part: "pronoun" })
// ENGLISH
.register("the", "a", "an").as({ part: "article" })
.register("take", "steal", "grab")
.as({ key: "take", part: "verb", prepositions: ["to", "from"] })
.register("drop", "leave").as({ key: "drop", part: "verb", prepositions: [] })
.register("wear", "put on").as({ key: "wear", part: "verb", prepositions: [] })
.register("ring").as({ key: "ring", part: "noun", role: "thing" })
.register("slipper").as({ key: "slipper", part: "noun", role: "thing" })
.register("diamond").as({ key: "ring", part: "adjective", role: "thing" })
.register("diamond jim").as({ key: "jim", part: "noun", role: "npc" })
.register("jim").as({ key: "james", part: "noun", role: "npc" })
.register("ruby").as({ key: "ring", part: "adjective", role: "thing" })
.register("ruby").as({ key: "ruby", part: "noun", role: "thing" })
.register("ruby").as({ key: "slipper", part: "adjective", role: "thing" })
.register("glass").as({ key: "slipper", part: "adjective", role: "thing" })
.register("glass").as({ key: "tumbler", part: "noun", role: "thing" })
.register("looking glass").as({ key: "mirror", part: "noun", role: "thing" })
.register("good looking").as({ key: "tumbler", part: "adjective", role: "thing" })
.register("good").as({ key: "mirror", part: "adjective", role: "thing" })
.register("tumbler").as({ key: "tumbler", part: "noun", role: "thing" })
.register("ruby").as({ key: "miss_ruby", part: "noun", role: "npc" })
.register("sam").as({ key: "sam", part: "noun", role: "npc" })
.register("from").as({ key: "from", part: "preposition" })
.register("to").as({ key: "to", part: "preposition" })
//Create a set of nested rules which mirror the wanted syntax tree.
var grammar = ishml.Rule()
grammar.snip("verbs").snip("nounPhrase").snip("conjunction")
grammar.nounPhrase.snip("article").snip("adjectives").snip("noun")
//Configure behavior of some of the rules with .configure().
grammar.verbs.configure({
minimum: 0,
maximum: Infinity,
filter: (definition) => definition.part === "verb"
})
grammar.nounPhrase.article.configure({
minimum: 0,
filter: (definition) => definition.part === "article"
})
grammar.nounPhrase.adjectives.configure({
minimum: 0,
maximum: Infinity,
filter: (definition) => definition.part === "adjective"
})
//Create a parser
this.parser = ishml.Parser({ lexicon, grammar })
})
describe('Парсер', function() {
it('должен понимать простые команды', function() {
const input = "взять кольцо"
const output = this.parser.analyze(input)
const interpretation = output.interpretations[0].gist
assert.notEmpty(interpretation.verbs)
assert.equal('взять', interpretation.verbs[0].lexeme)
assert.equal('перчатки', interpretation.nounPhrase.noun.lexeme)
})
it('should understand simple commands', function() {
const input = "take ring"
const output = this.parser.analyze(input)
const interpretation = output.interpretations[0].gist
assert.notEmpty(interpretation.verbs)
assert.equal('take', interpretation.verbs[0].lexeme)
assert.equal('ring', interpretation.nounPhrase.noun.lexeme)
})
it('должен понимать сложные команды', function() {
const input = "взять рубиновое кольцо у женщины и отдать его мужчине"
const output = this.parser.analyze(input)
const interpretation = output.interpretations[0].gist
console.log(interpretation)
assert.notEmpty(interpretation.verbs)
assert.equal('взять', interpretation.verbs[0].lexeme)
assert.notEmpty(interpretation.nounPhrase.adjectives)
assert.equal('отдать', interpretation.verbs[0].lexeme)
assert.equal('рубиновые', interpretation.nounPhrase.adjectives[0].lexeme)
assert.equal('перчатки', interpretation.nounPhrase.noun.lexeme)
})
it('should understand complex commands', function() {
const input = "take the ruby slipper from woman and give it to him"
const output = this.parser.analyze(input)
const interpretation = output.interpretations[0].gist
console.log(interpretation)
assert.notEmpty(interpretation.verbs)
assert.equal('take', interpretation.verbs[0].lexeme)
assert.equal('give', interpretation.verbs[1].lexeme)
assert.notEmpty(interpretation.nounPhrase.adjectives)
assert.equal('ruby', interpretation.nounPhrase.adjectives[0].lexeme)
assert.equal('slipper', interpretation.nounPhrase.noun.lexeme)
})
});