|
1 |
| -using System.Collections; |
| 1 | +using System; |
| 2 | +using System.Collections; |
| 3 | +using System.Collections.Generic; |
| 4 | +using System.Linq; |
| 5 | +using System.Threading; |
2 | 6 | using NUnit.Framework;
|
| 7 | +using System.Threading.Tasks; |
3 | 8 | using UnityEngine;
|
4 | 9 | using UnityEngine.TestTools;
|
5 | 10 |
|
6 | 11 | namespace PubnubApi.Unity.Tests {
|
7 | 12 |
|
| 13 | + public class DummyCustomClass { |
| 14 | + public string someText; |
| 15 | + public int someInt; |
| 16 | + public List<int> someCollection; |
| 17 | + } |
| 18 | + |
8 | 19 | public class Publish : PNTestBase {
|
9 | 20 | string lastMessage = null;
|
10 | 21 |
|
@@ -39,6 +50,61 @@ public IEnumerator ReceiveMessage() {
|
39 | 50 | lastMessage = null;
|
40 | 51 | }
|
41 | 52 |
|
| 53 | + [UnityTest] |
| 54 | + public IEnumerator PublishAndReceiveCustomMessageWithUnityJson() { |
| 55 | + var mainThread = Thread.CurrentThread; |
| 56 | + yield return TestTask().AsCoroutine(); |
| 57 | + async Task TestTask() { |
| 58 | + var randomChannelId = $"unity_test_{Guid.NewGuid()}"; |
| 59 | + |
| 60 | + pn.Subscribe<DummyCustomClass>().Channels(new []{randomChannelId}).Execute(); |
| 61 | + await Task.Delay(3000); |
| 62 | + |
| 63 | + var correctMessage = false; |
| 64 | + var correctThread = false; |
| 65 | + |
| 66 | + var receivedTaskSource = new TaskCompletionSource<bool>(); |
| 67 | + var receiveCancellation = new CancellationTokenSource(15000); |
| 68 | + receiveCancellation.Token.Register(() => receivedTaskSource.TrySetCanceled(), useSynchronizationContext: false); |
| 69 | + |
| 70 | + var messageDelegate = new Action<Pubnub,PNMessageResult<object>>(delegate(Pubnub p, PNMessageResult<object> message) { |
| 71 | + if (Thread.CurrentThread.Equals(mainThread)) { |
| 72 | + correctThread = true; |
| 73 | + } |
| 74 | + if (message.Message is DummyCustomClass dummyClassObject |
| 75 | + && dummyClassObject.someCollection.SequenceEqual(new List<int>() { 2, 1, 3, 7 }) |
| 76 | + && dummyClassObject.someText == "hello there" |
| 77 | + && dummyClassObject.someInt == 97) { |
| 78 | + correctMessage = true; |
| 79 | + } |
| 80 | + receivedTaskSource.TrySetResult(true); |
| 81 | + }); |
| 82 | + listener.onMessage += messageDelegate; |
| 83 | + |
| 84 | + var publishResult = await pn.Publish().Channel(randomChannelId).Message(new DummyCustomClass() { |
| 85 | + someCollection = new List<int>() { 2, 1, 3, 7 }, |
| 86 | + someInt = 97, |
| 87 | + someText = "hello there" |
| 88 | + }).ExecuteAsync(); |
| 89 | + |
| 90 | + Assert.IsNotNull(publishResult.Result, "publishResult.Result should not be null"); |
| 91 | + Assert.IsNotNull(publishResult.Status, "publishResult.Status should not be null"); |
| 92 | + Assert.IsFalse(publishResult.Status.Error, $"publishResult.Status.Error is true, error: {publishResult.Status.ErrorData?.Information}"); |
| 93 | + |
| 94 | + var received = true; |
| 95 | + try { |
| 96 | + await receivedTaskSource.Task.ConfigureAwait(false); |
| 97 | + } catch (TaskCanceledException e) { |
| 98 | + received = false; |
| 99 | + } |
| 100 | + Assert.IsTrue(received, "didn't receive message callback"); |
| 101 | + Assert.IsTrue(correctThread, "callback was dispatched on wrong thread"); |
| 102 | + Assert.IsTrue(correctMessage, "deserialized message had incorrect data"); |
| 103 | + |
| 104 | + listener.onMessage -= messageDelegate; |
| 105 | + } |
| 106 | + } |
| 107 | + |
42 | 108 | [TearDown]
|
43 | 109 | public void TearDown() {
|
44 | 110 | listener.onMessage -= OnMessage;
|
|
0 commit comments