player_life_test.cpp 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include <cassert>
  2. #include <array>
  3. #include "../Sunrise/src/middleware/bap/activity_message/activity_sense_update_decoder.cpp"
  4. #include "../Sunrise/src/middleware/bap/activity_message/sensor_auth_update.h"
  5. #include "../Sunrise/src/server/activity/mission/mission_script_player_sense.h"
  6. #include "../Sunrise/src/state/activity/membership/definition.h"
  7. #include "../Sunrise/src/core/logging/log.h"
  8. namespace sunrise::core::log {
  9. void write(Channel,Level,std::string_view) noexcept {}
  10. bool accepts(Channel,Level) noexcept {return false;}
  11. }
  12. namespace sunrise::middleware::bap::activity_message::sensor_auth_update {
  13. bool pad_bits(encoding::bits::Writer&,std::size_t) noexcept {assert(false);return false;}
  14. }
  15. namespace sense=sunrise::middleware::bap::activity_message::sense_update;
  16. namespace auth=sunrise::middleware::bap::activity_message::sensor_auth_update;
  17. namespace bits=sunrise::middleware::encoding::bits;
  18. using namespace sunrise::server::activity::mission;
  19. int main() {
  20. auth::Snapshot snapshot{};snapshot.hasRegion=true;snapshot.region=8;
  21. snapshot.playerKey=0x9EAA300100100102ULL;snapshot.hasDarknessPolicy=true;snapshot.darknessEnabled=true;
  22. std::array<std::byte,64> body{};bits::Writer writer(body);std::size_t written{};
  23. // Auth and Sense share the exact nested native schema layouts. Use the
  24. // independently existing Auth producer to verify the new full-body decoder.
  25. assert(auth::write_auth_body(writer,snapshot,13,true)&&writer.finish(written));
  26. PlayerLifeObservation level{};
  27. for (int dead=0;dead<=1;++dead) {
  28. // Schema808094E4: optional region(33), absent field1(1), flags2..5.
  29. if (dead) body[4]|=std::byte{0x04};
  30. bits::Reader source{std::span(body).first(written)};
  31. sense::Reader reader(source,writer.bit_count(),written*8);
  32. sense::DecodedPacket packet{};sense::DecodedObject object{};sense::Values values(packet,&object);
  33. assert(sense::decode_player(reader,values)==sense::NativeStatus::complete);
  34. assert(reader.left()==0);
  35. update_player_life(level,std::span(packet.values).first(packet.valueCount));
  36. assert(level.playerKey==snapshot.playerKey && level.region==8);
  37. assert(level.life()==(dead?PlayerLife::dead:PlayerLife::alive));
  38. bits::Reader shortSource{std::span(body).first(written)};
  39. sense::Reader shortReader(shortSource,writer.bit_count()-1,written*8);
  40. assert(sense::decode_player(shortReader,values)==sense::NativeStatus::malformed);
  41. }
  42. FireteamLife party{};assert(!party.all_dead());
  43. party.add(PlayerLife::dead);assert(party.all_dead());
  44. party.add(PlayerLife::alive);assert(!party.all_dead());
  45. party={};party.add(PlayerLife::dead);party.add(PlayerLife::unknown);assert(!party.all_dead());
  46. party={};party.add(PlayerLife::dead);party.add(PlayerLife::dead);assert(party.all_dead());
  47. level.loaded=false;assert(level.life()==PlayerLife::unknown);
  48. level.loaded=true;level.region=64;assert(level.life()!=PlayerLife::unknown);
  49. level.loaded=true;level.settled=false;assert(level.life()==PlayerLife::unknown);
  50. level.settled=true;level.region=-1;assert(level.life()==PlayerLife::unknown);
  51. level={};assert(level.life()==PlayerLife::unknown);
  52. using namespace sunrise::state::activity::membership;
  53. HardWipeState wipe{};wipe.active=true;wipe.host.state=1;wipe.host.opaqueByte=7;
  54. wipe.observe({4,6,0});assert(wipe.host.state==1); // Prior request cannot release this wipe.
  55. wipe.observe({0,7,0});assert(wipe.active && wipe.host.state==1);
  56. wipe.observe({2,7,0});assert(wipe.host.state==1);
  57. wipe.observe({4,7,0});assert(wipe.host.state==1 && wipe.active);
  58. wipe.release();assert(wipe.host.state==4);
  59. wipe.observe({4,7,0});assert(wipe.active);
  60. wipe.observe({0,7,0});assert(!wipe.active);
  61. wipe.observe({4,7,0});assert(!wipe.active); // Duplicate completed receipt cannot rearm.
  62. }