You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nlpcraft.apache.org by se...@apache.org on 2022/08/06 16:56:33 UTC

[incubator-nlpcraft] branch NLPCRAFT-510 created (now fd2522f7)

This is an automated email from the ASF dual-hosted git repository.

sergeykamov pushed a change to branch NLPCRAFT-510
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git


      at fd2522f7 Test client.

This branch includes the following new commits:

     new fd2522f7 Test client.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[incubator-nlpcraft] 01/01: Test client.

Posted by se...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sergeykamov pushed a commit to branch NLPCRAFT-510
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git

commit fd2522f7c4af6991627e4062633b748b66106370
Author: Sergey Kamov <sk...@gmail.com>
AuthorDate: Sat Aug 6 19:56:26 2022 +0300

    Test client.
---
 .../lightswitch/NCModelValidationSpec.scala        |  3 +-
 .../lightswitch/NCModelValidationSpec.scala        |  3 +-
 .../lightswitch/NCModelValidationSpec.scala        |  3 +-
 .../examples/time/NCModelValidationSpec.scala      |  3 +-
 .../scala/org/apache/nlpcraft/NCModelClient.scala  | 70 +---------------
 .../apache/nlpcraft/test/NCModelTestClient.scala   | 94 ++++++++++++++++++++++
 .../nlpcraft/internal/impl/NCModelClientSpec.scala |  3 +-
 .../internal/impl/NCModelClientSpec2.scala         |  3 +-
 .../internal/impl/NCModelClientSpec3.scala         |  3 +-
 9 files changed, 110 insertions(+), 75 deletions(-)

diff --git a/nlpcraft-examples/lightswitch-fr/src/test/scala/org/apache/nlpcraft/examples/lightswitch/NCModelValidationSpec.scala b/nlpcraft-examples/lightswitch-fr/src/test/scala/org/apache/nlpcraft/examples/lightswitch/NCModelValidationSpec.scala
index 2871ec51..a58af3bc 100644
--- a/nlpcraft-examples/lightswitch-fr/src/test/scala/org/apache/nlpcraft/examples/lightswitch/NCModelValidationSpec.scala
+++ b/nlpcraft-examples/lightswitch-fr/src/test/scala/org/apache/nlpcraft/examples/lightswitch/NCModelValidationSpec.scala
@@ -18,6 +18,7 @@
 package org.apache.nlpcraft.examples.lightswitch
 
 import org.apache.nlpcraft.*
+import org.apache.nlpcraft.test.NCModelTestClient
 import org.junit.jupiter.api.*
 
 import scala.util.Using
@@ -27,4 +28,4 @@ import scala.util.Using
   */
 class NCModelValidationSpec:
     @Test
-    def test(): Unit = Using.resource(new NCModelClient(new LightSwitchFrModel)) { _.validateSamples() }
+    def test(): Unit = Using.resource(new NCModelTestClient(new LightSwitchFrModel)) { _.validateSamples() }
diff --git a/nlpcraft-examples/lightswitch-ru/src/test/scala/org/apache/nlpcraft/examples/lightswitch/NCModelValidationSpec.scala b/nlpcraft-examples/lightswitch-ru/src/test/scala/org/apache/nlpcraft/examples/lightswitch/NCModelValidationSpec.scala
index 6b031eb9..ce5cd48d 100644
--- a/nlpcraft-examples/lightswitch-ru/src/test/scala/org/apache/nlpcraft/examples/lightswitch/NCModelValidationSpec.scala
+++ b/nlpcraft-examples/lightswitch-ru/src/test/scala/org/apache/nlpcraft/examples/lightswitch/NCModelValidationSpec.scala
@@ -18,6 +18,7 @@
 package org.apache.nlpcraft.examples.lightswitch
 
 import org.apache.nlpcraft.*
+import org.apache.nlpcraft.test.NCModelTestClient
 import org.junit.jupiter.api.*
 
 import scala.util.Using
@@ -27,4 +28,4 @@ import scala.util.Using
   */
 class NCModelValidationSpec:
     @Test
-    def test(): Unit = Using.resource(new NCModelClient(new LightSwitchRuModel)) { _.validateSamples() }
+    def test(): Unit = Using.resource(new NCModelTestClient(new LightSwitchRuModel)) { _.validateSamples() }
diff --git a/nlpcraft-examples/lightswitch/src/test/scala/org/apache/nlpcraft/examples/lightswitch/NCModelValidationSpec.scala b/nlpcraft-examples/lightswitch/src/test/scala/org/apache/nlpcraft/examples/lightswitch/NCModelValidationSpec.scala
index b95c943e..ef9102f0 100644
--- a/nlpcraft-examples/lightswitch/src/test/scala/org/apache/nlpcraft/examples/lightswitch/NCModelValidationSpec.scala
+++ b/nlpcraft-examples/lightswitch/src/test/scala/org/apache/nlpcraft/examples/lightswitch/NCModelValidationSpec.scala
@@ -18,6 +18,7 @@
 package org.apache.nlpcraft.examples.lightswitch
 
 import org.apache.nlpcraft.*
+import org.apache.nlpcraft.test.NCModelTestClient
 import org.junit.jupiter.api.*
 
 import scala.util.Using
@@ -26,7 +27,7 @@ import scala.util.Using
   * JUnit models validation.
   */
 class NCModelValidationSpec:
-    private def test(mdl: NCModel): Unit = Using.resource(new NCModelClient(mdl)) { _.validateSamples() }
+    private def test(mdl: NCModel): Unit = Using.resource(new NCModelTestClient(mdl)) { _.validateSamples() }
 
     @Test
     def test(): Unit = test(new LightSwitchScalaModel())
diff --git a/nlpcraft-examples/time/src/test/scala/org/apache/nlpcraft/examples/time/NCModelValidationSpec.scala b/nlpcraft-examples/time/src/test/scala/org/apache/nlpcraft/examples/time/NCModelValidationSpec.scala
index a79a81c1..ac0f6c24 100644
--- a/nlpcraft-examples/time/src/test/scala/org/apache/nlpcraft/examples/time/NCModelValidationSpec.scala
+++ b/nlpcraft-examples/time/src/test/scala/org/apache/nlpcraft/examples/time/NCModelValidationSpec.scala
@@ -18,6 +18,7 @@
 package org.apache.nlpcraft.examples.time
 
 import org.apache.nlpcraft.*
+import org.apache.nlpcraft.test.NCModelTestClient
 import org.junit.jupiter.api.*
 
 import scala.util.Using
@@ -27,4 +28,4 @@ import scala.util.Using
   */
 class NCModelValidationSpec:
     @Test
-    def test(): Unit = Using.resource(new NCModelClient(new TimeModel())) { _.validateSamples() }
+    def test(): Unit = Using.resource(new NCModelTestClient(new TimeModel())) { _.validateSamples() }
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/NCModelClient.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/NCModelClient.scala
index 4b5553e1..67a3c421 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/NCModelClient.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/NCModelClient.scala
@@ -40,7 +40,7 @@ import scala.concurrent.ExecutionContext
 class NCModelClient(mdl: NCModel) extends LazyLogging, AutoCloseable:
     verify()
 
-    private val intents = NCModelScanner.scan(mdl)
+    private[nlpcraft] val intents = NCModelScanner.scan(mdl)
     private val convMgr = NCConversationManager(mdl.getConfig)
     private val dlgMgr = NCDialogFlowManager(mdl.getConfig)
     private val plMgr = NCModelPipelineManager(mdl.getConfig, mdl.getPipeline)
@@ -78,7 +78,7 @@ class NCModelClient(mdl: NCModel) extends LazyLogging, AutoCloseable:
       * @param typ
       * @return
       */
-    private def ask0(txt: String, data: Map[String, Any], usrId: String, typ: NCIntentSolveType): Either[NCResult, NCCallbackData] =
+    private[nlpcraft] def ask0(txt: String, data: Map[String, Any], usrId: String, typ: NCIntentSolveType): Either[NCResult, NCCallbackData] =
         val plData = plMgr.prepare(txt, data, usrId)
 
         val userId = plData.request.getUserId
@@ -154,55 +154,6 @@ class NCModelClient(mdl: NCModel) extends LazyLogging, AutoCloseable:
         require(usrId != null, "User id cannot be null.")
         require(usrId != null, "Filter cannot be null.")
         dlgMgr.clear(usrId, (i: NCDialogFlowItem) => filter(i))
-
-    /**
-      *
-      */
-    def validateSamples(): Unit =
-        case class Result(intentId: String, text: String, error: Option[String], time: Long)
-
-        val userId = UUID.randomUUID().toString
-        val res = scala.collection.mutable.ArrayBuffer.empty[Result]
-
-        def now: Long = System.currentTimeMillis()
-
-        for (i <- intents; samples <- i.samples)
-            for (sample <- samples)
-                val start = now
-
-                val err: Option[String] =
-                    try
-                        val r = ask(sample, Map.empty, userId)
-
-                        Option.when(r.getIntentId.isEmpty || r.getIntentId.get != i.intent.id)(s"Unexpected intent ID: '${r.getIntentId.getOrElse("(not set)")}'")
-                    catch case e: Throwable =>
-                        logger.warn("Unexpected error.", e) 
-                        Option(e.getLocalizedMessage)
-
-                res += Result(i.intent.id, sample, err, now - start)
-
-            clearDialog(userId)
-            clearStm(userId)
-
-        val tbl = NCAsciiTable()
-        tbl #= ("Intent ID", "+/-", "Text", "Error", "ms.")
-
-        for (res <- res)
-            tbl += (
-                res.intentId,
-                if res.error.isEmpty then "OK" else "FAIL",
-                res.text,
-                res.error.getOrElse(""),
-                res.time
-            )
-
-        val passCnt = res.count(_.error.isEmpty)
-        val failCnt = res.count(_.error.isDefined)
-
-        tbl.info(logger, Option(s"Model auto-validation results: OK $passCnt, FAIL $failCnt:"))
-
-        if failCnt > 0 then require(false, "Some tests failed.")
-
     /**
       *
       */
@@ -211,20 +162,3 @@ class NCModelClient(mdl: NCModel) extends LazyLogging, AutoCloseable:
         dlgMgr.close()
         convMgr.close()
         intentsMgr.close()
-
-    /**
-      *
-      * @param txt
-      * @param data
-      * @param usrId
-      * @param saveHist
-      * @return
-      */
-    def debugAsk(txt: String, data: Map[String, AnyRef], usrId: String, saveHist: Boolean): NCCallbackData =
-        require(txt != null, "Input text cannot be null.")
-        require(data != null, "Data cannot be null.")
-        require(usrId != null, "User id cannot be null.")
-        import NCIntentSolveType.*
-        ask0(txt, data, usrId, if saveHist then SEARCH else SEARCH_NO_HISTORY).toOption.get
-
-    def debugAsk(txt: String, usrId: String, saveHist: Boolean): NCCallbackData = debugAsk(txt, Map.empty, usrId, saveHist)
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/test/NCModelTestClient.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/test/NCModelTestClient.scala
new file mode 100644
index 00000000..8d76bdee
--- /dev/null
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/test/NCModelTestClient.scala
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.nlpcraft.test
+
+import org.apache.nlpcraft.*
+import org.apache.nlpcraft.internal.ascii.NCAsciiTable
+import org.apache.nlpcraft.internal.intent.matcher.NCIntentSolveType
+import org.apache.nlpcraft.internal.intent.matcher.NCIntentSolveType.*
+
+import java.util.UUID
+
+class NCModelTestClient(mdl: NCModel) extends NCModelClient(mdl):
+    /**
+      *
+      * @param txt
+      * @param data
+      * @param usrId
+      * @param saveHist
+      * @return
+      */
+    def debugAsk(txt: String, data: Map[String, AnyRef], usrId: String, saveHist: Boolean): NCCallbackData =
+        require(txt != null, "Input text cannot be null.")
+        require(data != null, "Data cannot be null.")
+        require(usrId != null, "User id cannot be null.")
+        import NCIntentSolveType.*
+        ask0(txt, data, usrId, if saveHist then SEARCH else SEARCH_NO_HISTORY).toOption.get
+
+    def debugAsk(txt: String, usrId: String, saveHist: Boolean): NCCallbackData = debugAsk(txt, Map.empty, usrId, saveHist)
+
+
+
+    /**
+      *
+      */
+    def validateSamples(): Unit =
+        case class Result(intentId: String, text: String, error: Option[String], time: Long)
+
+        val userId = UUID.randomUUID().toString
+        val res = scala.collection.mutable.ArrayBuffer.empty[Result]
+
+        def now: Long = System.currentTimeMillis()
+
+        for (i <- intents; samples <- i.samples)
+            for (sample <- samples)
+                val start = now
+
+                val err: Option[String] =
+                    try
+                        val r = ask(sample, Map.empty, userId)
+
+                        Option.when(r.getIntentId.isEmpty || r.getIntentId.get != i.intent.id)(s"Unexpected intent ID: '${r.getIntentId.getOrElse("(not set)")}'")
+                    catch case e: Throwable =>
+                        logger.warn("Unexpected error.", e) 
+                        Option(e.getLocalizedMessage)
+
+                res += Result(i.intent.id, sample, err, now - start)
+
+            clearDialog(userId)
+            clearStm(userId)
+
+        val tbl = NCAsciiTable()
+        tbl #= ("Intent ID", "+/-", "Text", "Error", "ms.")
+
+        for (res <- res)
+            tbl += (
+                res.intentId,
+                if res.error.isEmpty then "OK" else "FAIL",
+                res.text,
+                res.error.getOrElse(""),
+                res.time
+            )
+
+        val passCnt = res.count(_.error.isEmpty)
+        val failCnt = res.count(_.error.isDefined)
+
+        tbl.info(logger, Option(s"Model auto-validation results: OK $passCnt, FAIL $failCnt:"))
+
+        if failCnt > 0 then require(false, "Some tests failed.")
+
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelClientSpec.scala b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelClientSpec.scala
index 4452a1c4..f9bc8f46 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelClientSpec.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelClientSpec.scala
@@ -22,6 +22,7 @@ import org.apache.nlpcraft.annotations.*
 import org.apache.nlpcraft.nlp.entity.parser.*
 import org.apache.nlpcraft.nlp.entity.parser.semantic.NCSemanticEntityParser
 import org.apache.nlpcraft.nlp.util.*
+import org.apache.nlpcraft.test.NCModelTestClient
 import org.junit.jupiter.api.Test
 
 import scala.jdk.CollectionConverters.*
@@ -46,7 +47,7 @@ class NCModelClientSpec:
     private def test0(mdl: NCTestModelAdapter): Unit =
         mdl.pipeline.entParsers += NCTestUtils.mkEnSemanticParser("models/lightswitch_model.yaml")
 
-        Using.resource(new NCModelClient(mdl)) { client =>
+        Using.resource(new NCModelTestClient(mdl)) { client =>
             val res = client.ask("Lights on at second floor kitchen", "userId")
 
             println(s"Intent: ${res.getIntentId}")
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelClientSpec2.scala b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelClientSpec2.scala
index 4333fa2b..5f643872 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelClientSpec2.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelClientSpec2.scala
@@ -22,6 +22,7 @@ import org.apache.nlpcraft.annotations.*
 import org.apache.nlpcraft.nlp.entity.parser.*
 import org.apache.nlpcraft.nlp.entity.parser.semantic.{NCSemanticTestElement, *}
 import org.apache.nlpcraft.nlp.util.*
+import org.apache.nlpcraft.test.NCModelTestClient
 import org.junit.jupiter.api.Test
 
 import java.util
@@ -47,7 +48,7 @@ class NCModelClientSpec2:
             def onMatch(ctx: NCContext, im: NCIntentMatch, @NCIntentTerm("t1") act: NCEntity, @NCIntentTerm("t2List") locs: List[NCEntity]): NCResult =
                 E("Shouldn't be called.")
 
-        Using.resource(new NCModelClient(mdl)) { client =>
+        Using.resource(new NCModelTestClient(mdl)) { client =>
             case class Result(txt: String):
                 private val wi = client.debugAsk(txt, "userId", true)
                 private val allArgs: List[List[NCEntity]] = wi.getCallbackArguments
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelClientSpec3.scala b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelClientSpec3.scala
index 332822ed..ceb80a31 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelClientSpec3.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelClientSpec3.scala
@@ -22,6 +22,7 @@ import org.apache.nlpcraft.annotations.*
 import org.apache.nlpcraft.nlp.entity.parser.*
 import org.apache.nlpcraft.nlp.entity.parser.semantic.*
 import org.apache.nlpcraft.nlp.util.*
+import org.apache.nlpcraft.test.NCModelTestClient
 import org.junit.jupiter.api.Test
 
 import java.util
@@ -46,7 +47,7 @@ class NCModelClientSpec3:
             @NCIntent("intent=i1 term(t1)={# == 'e1'}")
             def onMatch(ctx: NCContext, im: NCIntentMatch, @NCIntentTerm("t1") t1: NCEntity): NCResult = NCResult("Data", NCResultType.ASK_RESULT)
 
-        Using.resource(new NCModelClient(mdl)) { client =>
+        Using.resource(new NCModelTestClient(mdl)) { client =>
             def ask(): NCCallbackData = client.debugAsk("e1", "userId", true)
             def execCallback(cb: NCCallbackData): NCResult = cb.getCallback.apply(cb.getCallbackArguments)
             def execCallbackOk(cb: NCCallbackData): Unit = println(s"Result: ${execCallback(cb).getBody}")