test_translations.jl 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. julia_test_file = "test/traces/julia.csv"
  2. @testset "Mutate Message" begin
  3. top = CoupledDEVS(:Top)
  4. sender_ref = add_submodel!(top, :Sender, MockNode;
  5. out_ports=(; out=Float64),
  6. make_out=true, ta=1.0, output_msg=6.0
  7. )
  8. receiver_ref = add_submodel!(top, :Receiver, MockNode;
  9. inbox=(; in=Float64[]),
  10. )
  11. translate = (msg) -> (msg * 1.5)
  12. connect!(top, sender_ref.out, receiver_ref.in; Z=translate)
  13. model = compile_devs(top; logging=julia_test_file)
  14. simulate_devs!(model, 2.0)
  15. test_trace_equivalence(julia_test_file, "test/traces/MutateMessage.csv")
  16. receiver = model[model.path_to_id["Top.Receiver"]]
  17. @test receiver.n_external == 1
  18. @test length(receiver.inbox_log) == 1
  19. @test typeof(receiver.inbox_log[:in][1]) == Float64
  20. @test receiver.inbox_log[:in][1] == 9.0
  21. end
  22. @testset "Type Cast Message" begin
  23. top = CoupledDEVS(:Top)
  24. sender_ref = add_submodel!(top, :Sender, MockNode;
  25. out_ports=(; out=Float64),
  26. make_out=true, ta=1.0, output_msg=6.6
  27. )
  28. receiver_ref = add_submodel!(top, :Receiver, MockNode;
  29. inbox=(; in=Int[]),
  30. )
  31. translate = (msg) -> (ceil(msg))
  32. connect!(top, sender_ref.out, receiver_ref.in; Z=translate)
  33. model = compile_devs(top; logging=julia_test_file)
  34. simulate_devs!(model, 2.0)
  35. test_trace_equivalence(julia_test_file, "test/traces/TypeCastMessage.csv")
  36. receiver = model[model.path_to_id["Top.Receiver"]]
  37. @test receiver.n_external == 1
  38. @test length(receiver.inbox_log) == 1
  39. @test typeof(receiver.inbox_log[:in][1]) == Int
  40. @test receiver.inbox_log[:in][1] == 7
  41. end
  42. @testset "Chained Translations" begin
  43. top = CoupledDEVS(:Top)
  44. sender_ref = add_submodel!(top, :Sender, MockNode;
  45. out_ports=(; out=Int),
  46. make_out=true, ta=1.0
  47. )
  48. forwarder_ref = add_submodel!(top, :Forwarder, MockNode;
  49. inbox=(; in=Int[]),
  50. out_ports=(; out=Int),
  51. forward=true, ta=1.0
  52. )
  53. receiver_ref = add_submodel!(top, :Receiver, MockNode;
  54. inbox=(; in=Int[]),
  55. )
  56. connect!(top, sender_ref.out, forwarder_ref.in)
  57. connect!(top, forwarder_ref.out, receiver_ref.in)
  58. model = compile_devs(top; logging=julia_test_file)
  59. simulate_devs!(model, 2.0)
  60. test_trace_equivalence(julia_test_file, "test/traces/PassThrough.csv")
  61. forwarder = model[model.path_to_id["Top.Forwarder"]]
  62. @test forwarder.n_external == 1
  63. @test length(forwarder.inbox_log) == 1
  64. @test typeof(forwarder.inbox_log[:in][1]) == Int
  65. @test forwarder.inbox_log[:in][1] == 42
  66. @test forwarder.n_internal == 1
  67. @test forwarder.forward_msg === nothing
  68. receiver = model[model.path_to_id["Top.Receiver"]]
  69. @test receiver.n_external == 1
  70. @test length(receiver.inbox_log) == 1
  71. @test typeof(receiver.inbox_log[:in][1]) == Int
  72. @test receiver.inbox_log[:in][1] == 42
  73. end
  74. @testset "Fan-Out Translation Test" begin
  75. top = CoupledDEVS(:Top)
  76. sender_ref = add_submodel!(top, :Sender, MockNode;
  77. out_ports=(; out=Int),
  78. make_out=true, ta=1.0, output_msg=8
  79. )
  80. receiver_ref1 = add_submodel!(top, :Receiver1, MockNode;
  81. inbox=(; in=Int[]),
  82. )
  83. receiver_ref2 = add_submodel!(top, :Receiver2, MockNode;
  84. inbox=(; in=Int[]),
  85. )
  86. t1 = (msg) -> (msg * 2)
  87. t2 = (msg) -> (msg ^ 2)
  88. connect!(top, sender_ref.out, receiver_ref1.in; Z=t1)
  89. connect!(top, sender_ref.out, receiver_ref2.in; Z=t2)
  90. model = compile_devs(top; logging=julia_test_file)
  91. simulate_devs!(model)
  92. test_trace_equivalence(julia_test_file, "test/traces/TranslationFanOut.csv")
  93. receiver1 = model[model.path_to_id["Top.Receiver1"]]
  94. receiver2 = model[model.path_to_id["Top.Receiver2"]]
  95. @test receiver1.n_external == 1
  96. @test receiver2.n_external == 1
  97. @test length(receiver1.inbox_log) == 1
  98. @test length(receiver2.inbox_log) == 1
  99. @test receiver1.inbox_log[:in][1] == 16
  100. @test receiver2.inbox_log[:in][1] == 64
  101. end
  102. @testset "Flattened Translation" begin
  103. parent = CoupledDEVS(:parent)
  104. child1 = CoupledDEVS(:child1)
  105. add_out_port!(child1, :out)
  106. child2 = CoupledDEVS(:child2)
  107. add_in_port!(child2, :in)
  108. sender_ref = add_submodel!(child1, :sender, MockNode;
  109. out_ports=(; out=Int),
  110. make_out=true, ta=1.0, output_msg=2
  111. )
  112. receiver_ref = add_submodel!(child2, :receiver, MockNode;
  113. inbox=(; in=Int[]),
  114. )
  115. multiply = (msg) -> (msg ^ 2)
  116. connect!(child1, sender_ref.out, self.out; Z=multiply)
  117. connect!(child2, self.in, receiver_ref.in; Z=multiply)
  118. node_ref1 = add_submodel!(parent, :child1, child1)
  119. node_ref2 = add_submodel!(parent, :child2, child2)
  120. connect!(parent, node_ref1.out, node_ref2.in; Z=multiply)
  121. model = compile_devs(parent; logging=julia_test_file)
  122. simulate_devs!(model)
  123. test_trace_equivalence(julia_test_file, "test/traces/FlattenedTranslation.csv")
  124. receiver = model[model.path_to_id["parent.child2.receiver"]]
  125. @test receiver.n_external == 1
  126. @test length(receiver.inbox_log) == 1
  127. @test typeof(receiver.inbox_log[:in][1]) == Int
  128. @test receiver.inbox_log[:in][1] == 256
  129. end