Advertisement
Guest User

Untitled

a guest
Mar 24th, 2016
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.40 KB | None | 0 0
  1. # Instructions
  2. # ------------------------------------------------------------------------------
  3.  
  4. # This library adds the type STVar, which internally is an array structure with
  5. # sufficient information to serialize and deserialize itself.
  6.  
  7. # An STVar is any of the following:
  8. # STDict
  9. # STFloat
  10. # STInt
  11. # STQueue
  12. # STString
  13. # STVector
  14.  
  15. # Each type has a type constructor of the same name.
  16.  
  17. # For example, we can create a dict and populate it with values.
  18.  
  19. # var dict = STDict()
  20. # STDictSet(dict, "one", STInt(1))
  21. # STDictSet(dict, "two", STInt(2))
  22. # STDictSet(dict, "three", STInt(3))
  23. # STDictSet(dict, "one_as_string", STString("one"))
  24.  
  25. # A dict can contain other dicts as well.
  26.  
  27. # var dict2 = STDict()
  28. # STDictSet(dict2, "five", STInt(5))
  29. # STDictSet(dict, "recurse", dict2)
  30.  
  31. # Then store the data in memory for later.
  32.  
  33. # SaveMemory("memory_key", STSerialize(dict))
  34.  
  35. # And get it back in another session!
  36.  
  37. # if (HasMemory("memory_key"))
  38. # var dict = Deserialize(LoadMemory("memory_key"))
  39. # end
  40.  
  41. # See unit tests for more usage.
  42.  
  43.  
  44. # Globals
  45. # ------------------------------------------------------------------------------
  46.  
  47. # These should all be 1 byte long
  48. var gstTypeString = "s"
  49. var gstTypeInt = "i"
  50. var gstTypeFloat = "f"
  51. var gstTypeDict = "d"
  52. var gstTypeQueue = "q"
  53. var gstTypeVector = "v"
  54.  
  55. # Serializable type internal array positions
  56. var gstTypePos = 0
  57. var gstValuePos = 1
  58.  
  59. var gstQueueSizePos = 2
  60. var gstVectorSizePos = 2
  61.  
  62. var gstPrettyPrintIndent = " "
  63.  
  64.  
  65. # Program
  66. # ------------------------------------------------------------------------------
  67.  
  68. ClearText()
  69. STRunTests()
  70.  
  71.  
  72. # STVar Constructors
  73. # ------------------------------------------------------------------------------
  74.  
  75. # Create an STString
  76. #
  77. # @param string to lift into STVar
  78. #
  79. # @return New STVar
  80. var STString(string val)
  81. return [gstTypeString, val]
  82. end
  83.  
  84. # Create an STInt
  85. #
  86. # @param int to lift into STVar
  87. #
  88. # @return New STVar
  89. var STInt(number val)
  90. return [gstTypeInt, Int(val)]
  91. end
  92.  
  93. # Create an STFloat
  94. #
  95. # @param float to lift into STVar
  96. #
  97. # @return New STVar
  98. var STFloat(number val)
  99. return [gstTypeFloat, val]
  100. end
  101.  
  102. # Create an empty STQueue
  103. #
  104. # @return New STVar
  105. var STQueue()
  106. return [gstTypeQueue, [], 0]
  107. end
  108.  
  109. # Create an empty STDict
  110. #
  111. # @return New STVar
  112. var STDict()
  113. return [gstTypeDict, []]
  114. end
  115.  
  116. # Create an empty STVector
  117. #
  118. # @return New STVar
  119. var STVector()
  120. return [gstTypeVector, [], 0]
  121. end
  122.  
  123. # Dict functions
  124. # ------------------------------------------------------------------------------
  125.  
  126. # Add a value to an STDict
  127. #
  128. # @param STDict Dict to modify
  129. # @param string Key for value
  130. # @param STVar Value to add to STDict
  131. void STDictSet(array st, string key, var stVal)
  132. STAssertType(st, gstTypeDict)
  133. STAssertIsST(stVal)
  134.  
  135. array internal = STGet(st)
  136. internal[key] = stVal
  137. end
  138.  
  139. # Extract all keys in STDict
  140. #
  141. # @param STDict Dictionary with keys
  142. #
  143. # @return array All keys in STDict.
  144. array STDictKeys(array st)
  145. STAssertType(st, gstTypeDict)
  146.  
  147. array internal = STGet(st)
  148. return GetIndexes(internal)
  149. end
  150.  
  151. # Check if STDict has a key.
  152. #
  153. # @param STDict to examine.
  154. # @param string Key to verify existence.
  155. #
  156. # @return bool True if key in STDict.
  157. bool STDictHasKey(array st, string key)
  158. STAssertType(st, gstTypeDict)
  159.  
  160. array internal = STGet(st)
  161. return HasIndex(internal, key)
  162. end
  163.  
  164. # Get value by key from STDict
  165. #
  166. # @param STDict to examine.
  167. # @param string Key with value.
  168. #
  169. # @return STVar referenced by key from st.
  170. #
  171. # @warning Runtime failure if key does not exist.
  172. var STDictGetByKey(array st, string key)
  173. STAssertType(st, gstTypeDict)
  174.  
  175. array internal = STGet(st)
  176. return internal[key]
  177. end
  178.  
  179. # Remove a value from an STDict
  180. #
  181. # @param STDict to modify
  182. # @param string Key to remove
  183. void STDictRemoveByKey(array st, string key)
  184. STAssertType(st, gstTypeDict)
  185.  
  186. array internal = STGet(st)
  187. Remove(internal, key)
  188. end
  189.  
  190.  
  191. # Queue functions
  192. # ------------------------------------------------------------------------------
  193.  
  194. # Pushes value onto end of STQueue
  195. #
  196. # @param array STQueue created by STQueue
  197. # @param An STVar
  198. void STQueuePush(array st, var stVal)
  199. STAssertType(st, gstTypeQueue)
  200. STAssertIsST(stVal)
  201.  
  202. # increment size
  203. var currentSize = st[gstQueueSizePos]
  204. var newSize = currentSize + 1
  205. st[gstQueueSizePos] = newSize
  206.  
  207. # Add value
  208. var internalQueue = st[gstValuePos]
  209. internalQueue[currentSize] = stVal
  210. end
  211.  
  212. # Removes value from queue
  213. #
  214. # @param array STQueue created by STQueue
  215. #
  216. # @return Popped value
  217. var STQueuePop(array st)
  218. STAssertType(st, gstTypeQueue)
  219. if (STQueueSize(st) <= 0)
  220. STFail("STQueuePop on empty queue.")
  221. end
  222.  
  223. # decrement size
  224. var currentSize = st[gstQueueSizePos]
  225. var newSize = currentSize - 1
  226. st[gstQueueSizePos] = newSize
  227.  
  228. # return value
  229. var internalQueue = st[gstValuePos]
  230. return internalQueue[newSize]
  231. end
  232.  
  233. # Get size of STQueue
  234. #
  235. # @param STQueue
  236. #
  237. # @return number Size of argument
  238. number STQueueSize(array st)
  239. return st[gstQueueSizePos]
  240. end
  241.  
  242.  
  243. # Vector functions
  244. # ------------------------------------------------------------------------------
  245.  
  246. # Get element from vector
  247. #
  248. # @param STVector
  249. # @param number Position to insert new element starting a 0.
  250. #
  251. # @return Element from vector at indicated position.
  252. void STVectorAt(array st, number pos)
  253. array internal = STGet(st)
  254. return internal[pos]
  255. end
  256.  
  257. # Insert element into vector
  258. #
  259. # @param STVector
  260. # @param number Position to insert new element starting a 0.
  261. # @param STVal Value to append
  262. void STVectorInsert(array st, number insertPos, var stVal)
  263. number originalSize = st[gstVectorSizePos]
  264.  
  265. # increment size
  266. st[gstVectorSizePos] = st[gstVectorSizePos] + 1
  267.  
  268. array internal = STGet(st)
  269.  
  270. # Move insertPos and above one slot higher
  271. number i = originalSize
  272. loop
  273. var j = i - 1
  274. if (j < insertPos)
  275. break
  276. end
  277.  
  278. internal[i] = internal[j]
  279. i -= 1
  280. end
  281.  
  282. # insert element at position
  283. internal[insertPos] = stVal
  284. end
  285.  
  286. # Remove element from vector
  287. #
  288. # @param STVector
  289. # @param number Position to insert new element starting a 0.
  290. #
  291. # @return Removed element from vector.
  292. void STVectorRemoveAt(array st, number removePos)
  293. # decrment size
  294. st[gstVectorSizePos] = st[gstVectorSizePos] - 1
  295.  
  296. number newSize = st[gstVectorSizePos]
  297.  
  298. array internal = STGet(st)
  299.  
  300. var removedVal = internal[removePos]
  301.  
  302. # Rotate elements down
  303. number i = removePos
  304. loop
  305. var j = i + 1
  306. if (j > newSize)
  307. break
  308. end
  309.  
  310. internal[i] = internal[j]
  311. i += 1
  312. end
  313.  
  314. Remove(internal, newSize)
  315. end
  316.  
  317. # Add element to end of vector
  318. #
  319. # @param STVector
  320. # @param STVal Value to append
  321. void STVectorAppend(array st, var stVal)
  322. number newPos = st[gstVectorSizePos]
  323. st[gstVectorSizePos] = st[gstVectorSizePos] + 1
  324.  
  325. array internal = STGet(st)
  326. internal[newPos] = stVal
  327. end
  328.  
  329. # Get size of STVector
  330. #
  331. # @param STVector
  332. #
  333. # @return number Size of argument
  334. number STVectorSize(array st)
  335. return st[gstVectorSizePos]
  336. end
  337.  
  338.  
  339. # Serialization
  340. # ------------------------------------------------------------------------------
  341.  
  342. # Serialize an STVar
  343. #
  344. # @param STVar to serialize
  345. #
  346. # @return string representation of STVar
  347. string STSerialize(var st)
  348. string ret = ""
  349. var stType = STType(st)
  350.  
  351. if (stType == gstTypeString)
  352. string str = STGet(st)
  353. ret += stType + "{" + Count(str) + ":" + str + "}"
  354. else if (stType == gstTypeInt)
  355. ret += stType + "{" + STGet(st) + "}"
  356. else if (stType == gstTypeFloat)
  357. ret += stType + "{" + STGet(st) + "}"
  358. else if (stType == gstTypeDict)
  359. array keys = STDictKeys(st)
  360. ret += stType + "{"
  361. loop key in keys
  362. ret += STSerialize(STString(key))
  363. ret += STSerialize(STDictGetByKey(st, key))
  364. end
  365. ret += "}"
  366. else if (stType == gstTypeQueue)
  367. var size = STQueueSize(st)
  368. ret += stType + "{"
  369.  
  370. var innerArray = STGet(st)
  371. if (size > 0)
  372. loop i from 0 to size - 1
  373. ret += STSerialize(innerArray[i])
  374. end
  375. end
  376.  
  377. ret += "}"
  378. else if (stType == gstTypeVector)
  379. var size = STVectorSize(st)
  380. ret += stType + "{"
  381.  
  382. var innerArray = STGet(st)
  383. if (size > 0)
  384. loop i from 0 to size - 1
  385. ret += STSerialize(innerArray[i])
  386. end
  387. end
  388.  
  389. ret += "}"
  390. else
  391. STFail("STSerialize unhandled type: " + stType)
  392. end
  393.  
  394. return ret
  395. end
  396.  
  397. # Deserialize STVar serialized string representation
  398. #
  399. # @param string Data to deserialize.
  400. #
  401. # @return STVar from str.
  402. #
  403. # @warning Calls STFail on parse failure.
  404. var STDeserialize(string str)
  405. var ret = STDeserializeFrom(str, 0)
  406. return ret[0]
  407. end
  408.  
  409.  
  410. # Internal deserialize STVar serialized string representation
  411. #
  412. # @param string Data to deserialize.
  413. #
  414. # @return array 0: Extracted STVar
  415. # 1: End read position
  416. #
  417. # @warning Calls STFail on parse failure.
  418. var STDeserializeFrom(string str, number startPos)
  419. string typeStr = str[startPos]
  420.  
  421. if (str[startPos + 1] != "{")
  422. STFail("Unexpected opener: " + STStringExtractRest(str, startPos + 1))
  423. end
  424.  
  425. if (typeStr == gstTypeString)
  426. number strLenPos = startPos + 2
  427. number colonPos = STStringFindChar(str, ":", strLenPos)
  428. if (colonPos == -1)
  429. STFail("Colon unparsed in: " + STStringExtractRest(str, strLenPos))
  430. end
  431. number strLen = STStringExtract(str, strLenPos, colonPos)
  432.  
  433. number stringStartPos = colonPos + 1
  434. number stringEndPos = stringStartPos + strLen
  435.  
  436. if (str[stringEndPos] != "}")
  437. STFail("Unexpected closing bracket: " + STStringExtractRest(str, stringEndPos))
  438. end
  439.  
  440. return [STString(STStringExtract(str, stringStartPos, stringEndPos)), stringEndPos + 1]
  441. else if (typeStr == gstTypeInt)
  442. number intPos = startPos + 2
  443. number endPos = STStringFindChar(str, "}", intPos)
  444. if (endPos == -1)
  445. STFail("Closing bracket unparsed in: " + STStringExtractRest(str, intPos))
  446. end
  447.  
  448. number val = STStringExtract(str, intPos, endPos)
  449. return [STInt(Int(val)), endPos + 1]
  450. else if (typeStr == gstTypeFloat)
  451. number floatPos = startPos + 2
  452. number endPos = STStringFindChar(str, "}", floatPos)
  453. if (endPos == -1)
  454. STFail("Closing bracket unparsed in: " + STStringExtractRest(str, floatPos))
  455. end
  456.  
  457. number val = STStringExtract(str, floatPos, endPos)
  458. return [STFloat(val), endPos + 1]
  459. else if (typeStr == gstTypeDict)
  460. number readPos = startPos + 2
  461. var dict = STDict()
  462. loop
  463. if (str[readPos] == "}")
  464. break
  465. end
  466. var keyData = STDeserializeFrom(str, readPos)
  467. readPos = keyData[1]
  468.  
  469. var valueData = STDeserializeFrom(str, readPos)
  470. readPos = valueData[1]
  471.  
  472. STDictSet(dict, STGet(keyData[0]), valueData[0])
  473. end
  474. return [dict, readPos + 1]
  475. else if (typeStr == gstTypeQueue)
  476. number readPos = startPos + 2
  477. var queue = STQueue()
  478.  
  479. loop
  480. if (str[readPos] == "}")
  481. break
  482. end
  483.  
  484. var inner = STDeserializeFrom(str, readPos)
  485. STQueuePush(queue, inner[0])
  486. readPos = inner[1]
  487. end
  488.  
  489. return [queue, readPos + 1]
  490. else if (typeStr == gstTypeVector)
  491. number readPos = startPos + 2
  492. var vector = STVector()
  493.  
  494. loop
  495. if (str[readPos] == "}")
  496. break
  497. end
  498.  
  499. var inner = STDeserializeFrom(str, readPos)
  500. STVectorAppend(vector, inner[0])
  501. readPos = inner[1]
  502. end
  503.  
  504. return [vector, readPos + 1]
  505. else
  506. STFail("Unexpected type char: " + typeStr)
  507. end
  508. end
  509.  
  510.  
  511. # Library functions
  512. # ------------------------------------------------------------------------------
  513.  
  514. # Terminate program due to error
  515. #
  516. # @param string Reason to display to the user
  517. void STFail(string reason)
  518. Print("STFail: " + reason)
  519. var fail = []
  520. return fail[reason]
  521. end
  522.  
  523. # Convert type char to type string
  524. #
  525. # @param char The type as a char used by type system and serialization.
  526. #
  527. # @return string Full type name
  528. string STTypeAsString(string stType)
  529. if (stType == gstTypeString)
  530. return "STString"
  531. else if (stType == gstTypeInt)
  532. return "STInt"
  533. else if (stType == gstTypeFloat)
  534. return "STFloat"
  535. else if (stType == gstTypeDict)
  536. return "STDict"
  537. else if (stType == gstTypeQueue)
  538. return "STQueue"
  539. else if (stType == gstTypeVector)
  540. return "STVector"
  541. else
  542. return "Unknown ST type " + stType
  543. end
  544. end
  545.  
  546. # Compare two STVars
  547. #
  548. # @param STVar to compare
  549. # @param STVar to compare
  550. #
  551. # @return True if both arguments have same values
  552. bool STEqual(var a, var b)
  553. STAssertIsST(a)
  554. STAssertIsST(b)
  555.  
  556. var aType = STType(a)
  557. var bType = STType(b)
  558.  
  559. if (aType != bType)
  560. return False
  561. end
  562.  
  563. if (aType == gstTypeString)
  564. return STGet(a) == STGet(b)
  565. else if (aType == gstTypeInt)
  566. return STGet(a) == STGet(b)
  567. else if (aType == gstTypeFloat)
  568. return STGet(a) == STGet(b)
  569. else if (aType == gstTypeDict)
  570. var aKeys = STDictKeys(a)
  571. var bKeys = STDictKeys(b)
  572. if (Count(aKeys) != Count(bKeys))
  573. return False
  574. end
  575.  
  576. # iterate through all keys comparing equality
  577. loop key in aKeys
  578. if (STDictHasKey(b, key) == False)
  579. return False
  580. end
  581. if (STEqual(STDictGetByKey(a, key), STDictGetByKey(b, key)) == False)
  582. return False
  583. end
  584. end
  585.  
  586. return True
  587. else if (aType == gstTypeQueue)
  588. if (STQueueSize(a) != STQueueSize(b))
  589. return False
  590. end
  591.  
  592. var aInternal = STGet(a)
  593. var bInternal = STGet(b)
  594.  
  595. loop i from 0 to STQueueSize(a)
  596. if (STEqual(aInternal[i], bInternal[i]) == False)
  597. return False
  598. end
  599. return True
  600. end
  601. else if (aType == gstTypeVector)
  602. if (STVectorSize(a) != STVectorSize(b))
  603. return False
  604. end
  605.  
  606. var aInternal = STGet(a)
  607. var bInternal = STGet(b)
  608.  
  609. loop i from 0 to STVectorSize(a)
  610. if (STEqual(aInternal[i], bInternal[i]) == False)
  611. return False
  612. end
  613. return True
  614. end
  615. else
  616. STFail("STEqual unhandled type: " + STTypeAsString(aType))
  617. end
  618.  
  619. return False
  620. end
  621.  
  622. # Get type char from STVar
  623. #
  624. # @param STVar
  625. #
  626. # @return char Type as char
  627. string STType(var st)
  628. return st[gstTypePos]
  629. end
  630.  
  631. # Fail if STVar is not expected type
  632. #
  633. # @param STVar to check
  634. # @param char STVar expected type
  635. void STAssertType(var st, var expectedType)
  636. string actualType = STType(st)
  637. if (actualType != expectedType)
  638. string failStr = "Unexpected type '" + STTypeAsString(actualType)
  639. failStr += "' when '" + STTypeAsString(expectedType)
  640. failStr += "' was expected."
  641. STFail(failStr)
  642. end
  643. end
  644.  
  645. # Assert that argument is STVar
  646. #
  647. # @param any
  648. #
  649. # @warning Asserts if argument is not of type STVar.
  650. void STAssertIsST(var st)
  651. var stType = STType(st)
  652.  
  653. if (stType == gstTypeString)
  654. else if (stType == gstTypeInt)
  655. else if (stType == gstTypeFloat)
  656. else if (stType == gstTypeDict)
  657. else if (stType == gstTypeQueue)
  658. else if (stType == gstTypeVector)
  659. else
  660. STFail("Not a STVar")
  661. end
  662. end
  663.  
  664. # Unwrap STVar
  665. #
  666. # @param STVar to unwrap
  667. #
  668. # @return Unwrapped internal value. Only makes sense for basic types.
  669. var STGet(var st)
  670. return st[gstValuePos]
  671. end
  672.  
  673. # Output STVar as text
  674. #
  675. # @param STVar to print
  676. void STPrettyPrint(var st)
  677. STPrettyPrintIndented(st, 0)
  678. end
  679.  
  680. # Output STVar as text
  681. #
  682. # @param STVar to print
  683. # @param number Indentation level
  684. void STPrettyPrintIndented(var st, number indentLevel)
  685. string indent = ""
  686.  
  687. if (indentLevel > 0)
  688. loop x from 0 to (indentLevel - 1)
  689. indent += gstPrettyPrintIndent
  690. end
  691. end
  692.  
  693. var stType = STType(st)
  694.  
  695. if (stType == gstTypeString)
  696. Print(indent + "STString(" + STGet(st) + ")")
  697. else if (stType == gstTypeInt)
  698. Print(indent + "STInt(" + STGet(st) + ")")
  699. else if (stType == gstTypeFloat)
  700. Print(indent + "STFloat(" + STGet(st) + ")")
  701. else if (stType == gstTypeDict)
  702. Print(indent + "STDict {")
  703. var indent2 = indent + gstPrettyPrintIndent
  704. loop key in STDictKeys(st)
  705. Print(indent2 + key + ":")
  706. STPrettyPrintIndented(STDictGetByKey(st, key), indentLevel + 2)
  707. end
  708. Print(indent + "}")
  709. else if (stType == gstTypeQueue)
  710. Print(indent + "STQueue {")
  711. var size = STQueueSize(st)
  712. var count = 0
  713. loop value in STGet(st)
  714. if (count >= size)
  715. break
  716. end
  717. STPrettyPrintIndented(value, indentLevel + 1)
  718. end
  719. Print(indent + "}")
  720. else if (stType == gstTypeVector)
  721. Print(indent + "STVector {")
  722. var size = STVectorSize(st)
  723. var count = 0
  724. loop value in STGet(st)
  725. if (count >= size)
  726. break
  727. end
  728. STPrettyPrintIndented(value, indentLevel + 1)
  729. end
  730. Print(indent + "}")
  731. else
  732. STFail("Unknown ST type " + stType)
  733. end
  734. end
  735.  
  736. # Library Internal Helpers
  737. # ------------------------------------------------------------------------------
  738.  
  739. # Convenience substr function
  740. #
  741. # @param string Source extraction data
  742. # @param int Position to start extraction.
  743. # @param int Position to stop extraction. Not included in response.
  744. #
  745. # @return string extracted from str.
  746. string STStringExtract(string str, number startPos, number endPos)
  747. if (startPos >= endPos)
  748. return ""
  749. end
  750.  
  751. string ret = ""
  752. loop i from startPos to (endPos - 1)
  753. ret += str[i]
  754. end
  755. return ret
  756. end
  757.  
  758. # Convenience substr function
  759. #
  760. # @param string Source extraction data
  761. # @param int Position to start extraction.
  762. #
  763. # @return string extracted from str.
  764. var STStringExtractRest(string str, number startPos)
  765. return STStringExtract(str, startPos, Count(str))
  766. end
  767.  
  768. # Find character position
  769. #
  770. # @param string Search string
  771. # @param char Char to find in str.
  772. # @param number Position to start search.
  773. #
  774. # @return number -1 if ch doesn't exist, otherwise position of ch.
  775. number STStringFindChar(string str, string ch, number startPos)
  776. number size = Count(str)
  777. number remaining = size - startPos
  778.  
  779. if (remaining > 0)
  780. loop i from startPos to (size - 1)
  781. if (str[i] == ch)
  782. return i
  783. end
  784. end
  785. end
  786. return -1
  787. end
  788.  
  789. # Library Testing
  790. # ------------------------------------------------------------------------------
  791.  
  792. void STQueueTestMakeQueue()
  793. var queue = STQueue()
  794. STQueuePush(queue, STInt(1))
  795. STQueuePush(queue, STInt(2))
  796. STQueuePush(queue, STInt(3))
  797. STQueuePush(queue, STInt(4))
  798. STQueuePush(queue, STInt(5))
  799. STQueuePush(queue, STInt(6))
  800. STQueuePush(queue, STInt(0))
  801. STQueuePush(queue, STString("zero"))
  802.  
  803. var innerQueue = STQueue()
  804. STQueuePush(innerQueue, STInt(0))
  805. STQueuePush(innerQueue, STInt(1))
  806. STQueuePush(innerQueue, STInt(2))
  807.  
  808. STQueuePush(queue, innerQueue)
  809.  
  810. return queue
  811. end
  812.  
  813. void STQueueTest()
  814. var queue = STQueueTestMakeQueue()
  815. var queue2 = STQueueTestMakeQueue()
  816. if (STEqual(queue, queue2) == False)
  817. STFail("Queue equality failure.")
  818. end
  819.  
  820. STQueuePop(queue2)
  821. if (STEqual(queue, queue2) == True)
  822. STFail("Queue equality failure(2).")
  823. end
  824.  
  825. STTestSerialization(queue)
  826. end
  827.  
  828. void STDictTest()
  829. var dict = STDict()
  830. STDictSet(dict, "one", STInt(1))
  831. STDictSet(dict, "two", STInt(2))
  832. STDictSet(dict, "three", STInt(3))
  833.  
  834. if (STEqual(STDictGetByKey(dict, "two"), STInt(2) ) == False )
  835. STFail("Dict lookup failed expected value")
  836. end
  837.  
  838. var dict2 = STDict()
  839. STDictSet(dict2, "three", STInt(3))
  840. STDictSet(dict2, "two", STInt(2))
  841. STDictSet(dict2, "one", STInt(1))
  842.  
  843. if (STEqual(dict, dict2) == False)
  844. STFail("Dict equality failure.")
  845. end
  846.  
  847. STDictSet(dict2, "zero", STInt(0))
  848.  
  849. if (STEqual(dict, dict2) == True)
  850. STFail("Dict equality failure(2).")
  851. end
  852.  
  853. STTestSerialization(dict)
  854. end
  855.  
  856. void STVectorTest()
  857. var vector = STVector()
  858. STVectorAppend(vector, STInt(1))
  859. STVectorAppend(vector, STInt(2))
  860. STVectorAppend(vector, STInt(3))
  861.  
  862. if (STEqual(STVectorAt(vector, 1), STInt(2)) == False)
  863. STFail("vector lookup failed expected value")
  864. end
  865.  
  866. var vector2 = STVector()
  867. STVectorInsert(vector2, 0, STInt(3))
  868. STVectorInsert(vector2, 0, STInt(2))
  869. STVectorInsert(vector2, 0, STInt(1))
  870.  
  871. if (STEqual(vector, vector2) == False)
  872. STFail("Vector equality failure.")
  873. end
  874.  
  875. STVectorInsert(vector2, 0, STInt(0))
  876.  
  877. if (STEqual(vector, vector2) == True)
  878. STFail("Vector equality failure(2).")
  879. end
  880.  
  881. STVectorRemoveAt(vector2, 0)
  882.  
  883. if (STEqual(vector, vector2) == False)
  884. STFail("Vector equality failure(3).")
  885. end
  886.  
  887. STTestSerialization(vector)
  888. end
  889.  
  890. void STTestSerialization(var stVar)
  891. STPrettyPrint(stVar)
  892. var serialized = STSerialize(stVar)
  893. Print(serialized)
  894. var stStrDeserialized = STDeserialize(serialized)
  895. if (STEqual(stVar, stStrDeserialized) == False)
  896. STFail("Failed deserialization")
  897. end
  898. end
  899.  
  900. void STRunTests()
  901. STTestSerialization(STString("Test string"))
  902. STTestSerialization(STInt(51))
  903. STTestSerialization(STFloat(3.14))
  904.  
  905. STQueueTest()
  906. STDictTest()
  907. STVectorTest()
  908.  
  909. Print("STRunTests successful")
  910. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement