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

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


The following commit(s) were added to refs/heads/NLPCRAFT-491 by this push:
     new 10497d3c WIP.
10497d3c is described below

commit 10497d3c7074b4ce02ba41709004c3c5f90f05db
Author: Sergey Kamov <[email protected]>
AuthorDate: Thu Apr 7 19:37:59 2022 +0300

    WIP.
---
 .../{order => pizzeria}/PizzeriaModel.scala        | 25 +++------
 .../PizzeriaModelPipeline.scala                    |  4 +-
 .../{order => pizzeria}/PizzeriaOrder.scala        | 22 +++++---
 .../components/ElementExtender.scala               |  2 +-
 .../components/RequestValidator.scala              |  2 +-
 .../{order => pizzeria}/PizzeriaModelSpec.scala    | 63 ++++++++++++++++++----
 .../cli/PizzeriaModelClientCli.scala               |  2 +-
 .../cli/PizzeriaModelServer.scala                  |  4 +-
 8 files changed, 83 insertions(+), 41 deletions(-)

diff --git 
a/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/PizzeriaModel.scala
 
b/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModel.scala
similarity index 89%
rename from 
nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/PizzeriaModel.scala
rename to 
nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModel.scala
index 8bcd5f29..faf3e891 100644
--- 
a/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/PizzeriaModel.scala
+++ 
b/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModel.scala
@@ -15,12 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.nlpcraft.examples.order
+package org.apache.nlpcraft.examples.pizzeria
 
 import com.typesafe.scalalogging.LazyLogging
 import org.apache.nlpcraft.*
 import org.apache.nlpcraft.NCResultType.*
-import org.apache.nlpcraft.examples.order.State.*
+import org.apache.nlpcraft.examples.pizzeria.State.*
 import org.apache.nlpcraft.nlp.*
 
 import java.util.Properties
@@ -32,7 +32,6 @@ import scala.jdk.OptionConverters.*
   *
   */
 object PizzeriaModel extends LazyLogging:
-    private val DFLT_QTY = 1
     private val UNEXPECTED_REQUEST = new NCRejection("Unexpected request for 
current dialog context.")
 
     private def extractPizzaSize(e: NCEntity): String = 
e.get[String]("ord:pizza:size:value")
@@ -42,17 +41,8 @@ object PizzeriaModel extends LazyLogging:
     private def extractDrink(e: NCEntity): Drink =
         Drink(e.get[String]("ord:drink:value"), extractQty(e, "ord:drink:qty"))
 
-    private def getDescription(o: PizzeriaOrder): String =
-        if !o.isEmpty then
-            def s(name: String, seq: Iterable[String]): String = if 
seq.nonEmpty then s"$name: ${seq.mkString(", ")}" else ""
-            val s1 = s("Pizza", o.getPizzas.map(p => s"${p.name}, 
'${p.size.getOrElse("undefined size")}' ${p.qty.getOrElse(DFLT_QTY)} p."))
-            val s2 = s("Drinks", o.getDrinks.map(p => s"${p.name} 
${p.qty.getOrElse(DFLT_QTY)} p."))
 
-            if s2.isEmpty then s1 else if s1.isEmpty then s2 else s"$s1 $s2"
-        else "Nothing ordered."
-
-
-import org.apache.nlpcraft.examples.order.PizzeriaModel.*
+import org.apache.nlpcraft.examples.pizzeria.PizzeriaModel.*
 
 /**
   *
@@ -102,25 +92,26 @@ class PizzeriaModel extends NCModelAdapter (new 
NCModelConfig("nlpcraft.pizzeria
         )
 
     private def doShowStatus(o: PizzeriaOrder, newState: State) =
-        val res = NCResult(s"Current order state: ${getDescription(o)}", 
ASK_RESULT)
+        val res = NCResult(s"Current order state: ${o.getDescription}", 
ASK_RESULT)
         o.setState(newState)
         res
 
     private def askConfirm(o: PizzeriaOrder): NCResult =
         require(o.isValid)
-        val res = NCResult(s"Let's specify your order. ${getDescription(o)} Is 
it correct?", ASK_DIALOG)
+        val res = NCResult(s"Let's specify your order. ${o.getDescription} Is 
it correct?", ASK_DIALOG)
         o.setState(DIALOG_CONFIRM)
         res
 
     private def clear(im: NCIntentMatch, o: PizzeriaOrder): Unit =
+        o.setState(NO_DIALOG)
         
im.getContext.getConversation.getData.remove(im.getContext.getRequest.getUserId)
         val conv = im.getContext.getConversation
         conv.clearStm(_ => true)
         conv.clearDialog(_ => true)
 
-    private def doExecute(im: NCIntentMatch, o: PizzeriaOrder): NCResult =
+    private[pizzeria] def doExecute(im: NCIntentMatch, o: PizzeriaOrder): 
NCResult =
         require(o.isValid)
-        val res = NCResult(s"Executed: ${getDescription(o)}", ASK_RESULT)
+        val res = NCResult(s"Executed: ${o.getDescription}", ASK_RESULT)
         clear(im, o)
         res
 
diff --git 
a/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/PizzeriaModelPipeline.scala
 
b/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModelPipeline.scala
similarity index 94%
rename from 
nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/PizzeriaModelPipeline.scala
rename to 
nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModelPipeline.scala
index b8b73a65..ce342519 100644
--- 
a/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/PizzeriaModelPipeline.scala
+++ 
b/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModelPipeline.scala
@@ -1,8 +1,8 @@
-package org.apache.nlpcraft.examples.order
+package org.apache.nlpcraft.examples.pizzeria
 
 import edu.stanford.nlp.pipeline.StanfordCoreNLP
 import opennlp.tools.stemmer.PorterStemmer
-import org.apache.nlpcraft.examples.order.components.*
+import org.apache.nlpcraft.examples.pizzeria.components.*
 import org.apache.nlpcraft.nlp.entity.parser.semantic.*
 import org.apache.nlpcraft.nlp.entity.parser.stanford.NCStanfordNLPEntityParser
 import org.apache.nlpcraft.nlp.token.enricher.NCEnStopWordsTokenEnricher
diff --git 
a/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/PizzeriaOrder.scala
 
b/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaOrder.scala
similarity index 81%
rename from 
nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/PizzeriaOrder.scala
rename to 
nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaOrder.scala
index d9445826..0e751b98 100644
--- 
a/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/PizzeriaOrder.scala
+++ 
b/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaOrder.scala
@@ -15,10 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.nlpcraft.examples.order
+package org.apache.nlpcraft.examples.pizzeria
 
+import java.util.Objects
 import scala.collection.mutable
-
 /**
   *
   */
@@ -45,11 +45,10 @@ case class Drink(name: String, var qty: Option[Int]) 
extends OrderElement
 enum State:
     case NO_DIALOG, DIALOG_IS_READY, DIALOG_SHOULD_CANCEL, DIALOG_SPECIFY, 
DIALOG_CONFIRM
 
-import org.apache.nlpcraft.examples.order.State.*
+import org.apache.nlpcraft.examples.pizzeria.State.*
 
-/**
-  *
-  */
+object PizzeriaOrder:
+    private val DFLT_QTY = 1
 class PizzeriaOrder:
     private var state = NO_DIALOG
     private val pizzas = mutable.ArrayBuffer.empty[Pizza]
@@ -131,4 +130,13 @@ class PizzeriaOrder:
       *
       * @param state
       */
-    def setState(state: State): Unit = this.state = state
\ No newline at end of file
+    def setState(state: State): Unit = this.state = state
+
+    def getDescription: String =
+        if !isEmpty then
+            def s(name: String, seq: Iterable[String]): String = if 
seq.nonEmpty then s"$name: ${seq.mkString(", ")}" else ""
+            val s1 = s("Pizza", getPizzas.map(p => s"${p.name}, 
'${p.size.getOrElse("undefined size")}' 
${p.qty.getOrElse(PizzeriaOrder.DFLT_QTY)} p."))
+            val s2 = s("Drinks", getDrinks.map(p => s"${p.name} 
${p.qty.getOrElse(PizzeriaOrder.DFLT_QTY)} p."))
+
+            if s2.isEmpty then s1 else if s1.isEmpty then s2 else s"$s1 $s2"
+        else "Nothing ordered."
\ No newline at end of file
diff --git 
a/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/components/ElementExtender.scala
 
b/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/components/ElementExtender.scala
similarity index 97%
rename from 
nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/components/ElementExtender.scala
rename to 
nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/components/ElementExtender.scala
index d4a84201..364f1058 100644
--- 
a/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/components/ElementExtender.scala
+++ 
b/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/components/ElementExtender.scala
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.nlpcraft.examples.order.components
+package org.apache.nlpcraft.examples.pizzeria.components
 
 import org.apache.nlpcraft.*
 
diff --git 
a/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/components/RequestValidator.scala
 
b/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/components/RequestValidator.scala
similarity index 96%
rename from 
nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/components/RequestValidator.scala
rename to 
nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/components/RequestValidator.scala
index f94e160b..34f5d698 100644
--- 
a/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/components/RequestValidator.scala
+++ 
b/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/components/RequestValidator.scala
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.nlpcraft.examples.order.components
+package org.apache.nlpcraft.examples.pizzeria.components
 
 import org.apache.nlpcraft.*
 
diff --git 
a/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/order/PizzeriaModelSpec.scala
 
b/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModelSpec.scala
similarity index 54%
rename from 
nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/order/PizzeriaModelSpec.scala
rename to 
nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModelSpec.scala
index 38a13282..4e3b22cf 100644
--- 
a/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/order/PizzeriaModelSpec.scala
+++ 
b/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModelSpec.scala
@@ -15,11 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.nlpcraft.examples.order
+package org.apache.nlpcraft.examples.pizzeria
 
 import org.apache.nlpcraft.*
 import org.apache.nlpcraft.NCResultType.*
-import org.junit.jupiter.api.{AfterEach, BeforeEach, Test}
+import org.apache.nlpcraft.examples.pizzeria.State.*
+import org.junit.jupiter.api.*
 
 import scala.util.Using
 import scala.collection.mutable
@@ -27,13 +28,32 @@ import scala.collection.mutable
   *
   */
 class PizzeriaModelSpec:
+    private class TestWrapper extends PizzeriaModel:
+        private var o: PizzeriaOrder = _
+        override def doExecute(im: NCIntentMatch, o: PizzeriaOrder): NCResult =
+            val res = super.doExecute(im, o)
+            this.o = o
+            res
+        def getLastExecutedOrder: PizzeriaOrder = o
+
+    case class Builder(state: State):
+        private val o = new PizzeriaOrder
+        o.setState(state)
+        def withPizza(name: String, size: String, qty: Int): Builder =
+            o.add(Seq(Pizza(name, Some(size), Some(qty))), Seq.empty)
+            this
+        def withDrink(name: String, qty: Int): Builder =
+            o.add(Seq.empty, Seq(Drink(name, Some(qty))))
+            this
+        def build: PizzeriaOrder = o
+
+    private val mdl = new TestWrapper()
+    private val client = new NCModelClient(mdl)
+
     private val msgs = mutable.ArrayBuffer.empty[mutable.ArrayBuffer[String]]
     private val errs = mutable.HashMap.empty[Int, Throwable]
-
-    private var client: NCModelClient = _
     private var testNum: Int = 0
 
-    @BeforeEach def setUp(): Unit = client = new NCModelClient(new 
PizzeriaModel)
     @AfterEach def tearDown(): Unit =
         if client != null then client.close()
 
@@ -47,7 +67,9 @@ class PizzeriaModelSpec:
 
         require(errs.isEmpty)
 
-    private def dialog(reqs: String*): Unit =
+    private def dialog(reqs: String*): Unit = dialog(None, reqs*)
+    private def dialog(expResOrder: PizzeriaOrder, reqs: String*): Unit = 
dialog(Option(expResOrder), reqs*)
+    private def dialog(expResOrderOpt: Option[PizzeriaOrder], reqs: String*): 
Unit =
         val testMsgs = mutable.ArrayBuffer.empty[String]
         msgs += testMsgs
 
@@ -63,12 +85,29 @@ class PizzeriaModelSpec:
                 val expType = if idx == reqs.size - 1 then ASK_RESULT else 
ASK_DIALOG
 
                 if expType != resp.getType then
-                    errs += testNum -> new Exception(s"Error during test 
[num=$testNum, expRespType=$expType, type=${resp.getType}]")
+                    errs += testNum -> new Exception(s"Unexpected result for 
test:$testNum [expected:\n$expType, type=${resp.getType}]")
+
+                if idx == reqs.size - 1 then
+                    expResOrderOpt match
+                        case Some(expResOrder) =>
+                            val lastOrder = mdl.getLastExecutedOrder
+                            def s(o: PizzeriaOrder) = if o == null then null 
else s"Order [state=${o.getState}, desc=${o.getDescription}]"
+                            val s1 = s(expResOrder)
+                            val s2 = s(lastOrder)
+                            if s1 != s2 then
+                                errs += testNum -> new Exception(s"Unexpected 
result for test (excepted/real):$testNum\n$s1\n$s2")
+                        case None => // No-op.
             catch
                 case e: Exception => errs += testNum -> new Exception(s"Error 
during test [num=$testNum]", e)
 
         testNum += 1
 
+    private def mkOrder(state: State, ps: Seq[Pizza], ds: Seq[Drink]): 
PizzeriaOrder =
+        val o = new PizzeriaOrder
+        o.setState(state)
+        o.add(ps, ds)
+        o
+
     @Test
     def test(): Unit =
         dialog(
@@ -99,12 +138,16 @@ class PizzeriaModelSpec:
         )
 
         dialog(
-            "carbonara",
+            "marinara",
             "stop"
         )
-
         dialog(
-            "carbonara two, marinara and 2 tea",
+            Builder(NO_DIALOG).
+                withPizza("margherita", "small", 2).
+                withPizza("marinara", "small", 3).
+                withDrink("tea", 1).
+                build,
+            "margherita two, marinara and 3 tea",
             "small",
             "small",
             "yes",
diff --git 
a/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/order/cli/PizzeriaModelClientCli.scala
 
b/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/cli/PizzeriaModelClientCli.scala
similarity index 98%
rename from 
nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/order/cli/PizzeriaModelClientCli.scala
rename to 
nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/cli/PizzeriaModelClientCli.scala
index b621d1f8..7c35164f 100644
--- 
a/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/order/cli/PizzeriaModelClientCli.scala
+++ 
b/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/cli/PizzeriaModelClientCli.scala
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.nlpcraft.examples.order.cli
+package org.apache.nlpcraft.examples.pizzeria.cli
 
 import com.typesafe.scalalogging.LazyLogging
 import org.apache.nlpcraft.*
diff --git 
a/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/order/cli/PizzeriaModelServer.scala
 
b/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/cli/PizzeriaModelServer.scala
similarity index 97%
rename from 
nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/order/cli/PizzeriaModelServer.scala
rename to 
nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/cli/PizzeriaModelServer.scala
index e345dbe4..1f89208d 100644
--- 
a/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/order/cli/PizzeriaModelServer.scala
+++ 
b/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/cli/PizzeriaModelServer.scala
@@ -15,12 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.nlpcraft.examples.order.cli
+package org.apache.nlpcraft.examples.pizzeria.cli
 
 import com.sun.net.httpserver.*
 import org.apache.nlpcraft.*
 import org.apache.nlpcraft.NCResultType.*
-import org.apache.nlpcraft.examples.order.PizzeriaModel
+import org.apache.nlpcraft.examples.pizzeria.PizzeriaModel
 
 import java.io.*
 import java.net.InetSocketAddress

Reply via email to