diff --git a/src/RA_Defs.cpp b/src/RA_Defs.cpp index 80c1520d..1d956638 100644 --- a/src/RA_Defs.cpp +++ b/src/RA_Defs.cpp @@ -1,13 +1,7 @@ #include "RA_Defs.h" -#include "context/IEmulatorMemoryContext.hh" - -#include "services/ServiceLocator.hh" - #include "util/Strings.hh" -#include - namespace ra { _Use_decl_annotations_ @@ -123,40 +117,4 @@ bool ParseFloat(const std::wstring& sValue, float& fValue, std::wstring& sError) return true; } -namespace data { - -const char* ValueFormatToString(ValueFormat nFormat) noexcept -{ - switch (nFormat) - { - case ValueFormat::Centiseconds: return "MILLISECS"; - case ValueFormat::Frames: return "TIME"; - case ValueFormat::Minutes: return "MINUTES"; - case ValueFormat::Score: return "SCORE"; - case ValueFormat::Seconds: return "TIMESECS"; - case ValueFormat::SecondsAsMinutes: return "SECS_AS_MINS"; - case ValueFormat::Value: return "VALUE"; - case ValueFormat::Float1: return "FLOAT1"; - case ValueFormat::Float2: return "FLOAT2"; - case ValueFormat::Float3: return "FLOAT3"; - case ValueFormat::Float4: return "FLOAT4"; - case ValueFormat::Float5: return "FLOAT5"; - case ValueFormat::Float6: return "FLOAT6"; - case ValueFormat::Fixed1: return "FIXED1"; - case ValueFormat::Fixed2: return "FIXED2"; - case ValueFormat::Fixed3: return "FIXED3"; - case ValueFormat::Tens: return "TENS"; - case ValueFormat::Hundreds: return "HUNDREDS"; - case ValueFormat::Thousands: return "THOUSANDS"; - case ValueFormat::UnsignedValue: return "UNSIGNED"; - default: return "UNKNOWN"; - } -} - -ValueFormat ValueFormatFromString(const std::string& sFormat) noexcept -{ - return ra::itoe(rc_parse_format(sFormat.c_str())); -} - -} /* namespace data */ } /* namespace ra */ diff --git a/src/api/UpdateLeaderboard.hh b/src/api/UpdateLeaderboard.hh index 323395ce..e0bd3a65 100644 --- a/src/api/UpdateLeaderboard.hh +++ b/src/api/UpdateLeaderboard.hh @@ -4,7 +4,7 @@ #include "ApiCall.hh" -#include "data\Types.hh" +#include "data\Value.hh" namespace ra { namespace api { @@ -29,7 +29,7 @@ public: std::string SubmitTrigger; std::string CancelTrigger; std::string ValueDefinition; - ra::data::ValueFormat Format{ ra::data::ValueFormat::Value }; + ra::data::Value::Format Format{ ra::data::Value::Format::Value }; bool LowerIsBetter{ false }; using Callback = std::function; diff --git a/src/api/impl/ConnectedServer.cpp b/src/api/impl/ConnectedServer.cpp index 112b7b2b..7410744f 100644 --- a/src/api/impl/ConnectedServer.cpp +++ b/src/api/impl/ConnectedServer.cpp @@ -735,7 +735,7 @@ UpdateLeaderboard::Response ConnectedServer::UpdateLeaderboard(const UpdateLeade api_params.cancel_trigger = request.CancelTrigger.c_str(); api_params.value_definition = request.ValueDefinition.c_str(); api_params.lower_is_better = request.LowerIsBetter ? 1 : 0; - api_params.format = ValueFormatToString(request.Format); + api_params.format = ra::data::Value::FormatToServerEnum(request.Format); rc_api_request_t api_request; const int result = rc_api_init_update_leaderboard_request(&api_request, &api_params); diff --git a/src/data/Types.hh b/src/data/Types.hh index c552163d..927f22e1 100644 --- a/src/data/Types.hh +++ b/src/data/Types.hh @@ -17,36 +17,6 @@ namespace ra { using AchievementID = uint32_t; using LeaderboardID = uint32_t; -namespace data { - -enum class ValueFormat : uint8_t -{ - Frames = RC_FORMAT_FRAMES, - Seconds = RC_FORMAT_SECONDS, - Centiseconds = RC_FORMAT_CENTISECS, - Score = RC_FORMAT_SCORE, - Value = RC_FORMAT_VALUE, - Minutes = RC_FORMAT_MINUTES, - SecondsAsMinutes = RC_FORMAT_SECONDS_AS_MINUTES, - Float1 = RC_FORMAT_FLOAT1, - Float2 = RC_FORMAT_FLOAT2, - Float3 = RC_FORMAT_FLOAT3, - Float4 = RC_FORMAT_FLOAT4, - Float5 = RC_FORMAT_FLOAT5, - Float6 = RC_FORMAT_FLOAT6, - Fixed1 = RC_FORMAT_FIXED1, - Fixed2 = RC_FORMAT_FIXED2, - Fixed3 = RC_FORMAT_FIXED3, - Tens = RC_FORMAT_TENS, - Hundreds = RC_FORMAT_HUNDREDS, - Thousands = RC_FORMAT_THOUSANDS, - UnsignedValue = RC_FORMAT_UNSIGNED_VALUE, -}; - -const char* ValueFormatToString(ValueFormat nFormat) noexcept; -ValueFormat ValueFormatFromString(const std::string& sFormat) noexcept; - -} // namespace data } // namespace ra #endif RA_UI_TYPES_H diff --git a/src/data/models/LeaderboardModel.cpp b/src/data/models/LeaderboardModel.cpp index 24d7561e..d5abd913 100644 --- a/src/data/models/LeaderboardModel.cpp +++ b/src/data/models/LeaderboardModel.cpp @@ -19,7 +19,7 @@ const IntModelProperty LeaderboardModel::StartTriggerProperty("LeaderboardModel" const IntModelProperty LeaderboardModel::SubmitTriggerProperty("LeaderboardModel", "SubmitTrigger", 0); const IntModelProperty LeaderboardModel::CancelTriggerProperty("LeaderboardModel", "CancelTrigger", 0); const IntModelProperty LeaderboardModel::ValueDefinitionProperty("LeaderboardModel", "ValueDefinition", 0); -const IntModelProperty LeaderboardModel::ValueFormatProperty("LeaderboardModel", "ValueFormat", ra::etoi(ValueFormat::Value)); +const IntModelProperty LeaderboardModel::ValueFormatProperty("LeaderboardModel", "ValueFormat", ra::etoi(ra::data::Value::Format::Value)); const IntModelProperty LeaderboardModel::PauseOnResetProperty("LeaderboardModel", "PauseOnReset", ra::etoi(LeaderboardModel::LeaderboardParts::None)); const IntModelProperty LeaderboardModel::PauseOnTriggerProperty("LeaderboardModel", "PauseOnTrigger", ra::etoi(LeaderboardModel::LeaderboardParts::None)); const BoolModelProperty LeaderboardModel::LowerIsBetterProperty("LeaderboardModel", "LowerIsBetter", false); @@ -478,7 +478,7 @@ void LeaderboardModel::InitializeFromPublishedLeaderboard( SetName(ra::util::String::Widen(pLeaderboard.public_.title)); SetDescription(ra::util::String::Widen(pLeaderboard.public_.description)); SetCategory(AssetCategory::Core); - SetValueFormat(ra::itoe(pLeaderboard.format)); + SetValueFormat(Value::FormatFromRcheevosFormat(pLeaderboard.format)); SetLowerIsBetter(pLeaderboard.public_.lower_is_better); SetHidden(pLeaderboard.hidden); SetDefinition(sDefinition); @@ -545,7 +545,7 @@ void LeaderboardModel::Serialize(ra::services::TextWriter& pWriter) const WriteQuoted(pWriter, GetLocalAssetDefinition(m_pSubmitTrigger)); WriteQuoted(pWriter, GetLocalAssetDefinition(m_pValueDefinition)); - WritePossiblyQuoted(pWriter, ValueFormatToString(GetValueFormat())); + WritePossiblyQuoted(pWriter, Value::FormatToServerEnum(GetValueFormat())); WritePossiblyQuoted(pWriter, GetLocalValue(NameProperty)); WritePossiblyQuoted(pWriter, GetLocalValue(DescriptionProperty)); @@ -603,18 +603,11 @@ bool LeaderboardModel::Deserialize(ra::util::Tokenizer& pTokenizer) SetValueDefinition(sValueDefinition); SetLowerIsBetter(nLowerIsBetter != 0); - SetValueFormat(ValueFormatFromString(sFormat)); + SetValueFormat(Value::FormatFromServerEnum(sFormat)); return true; } -std::string LeaderboardModel::FormatScore(int nValue) const -{ - char buffer[32]; - rc_format_value(buffer, sizeof(buffer), nValue, ra::etoi(GetValueFormat())); - return std::string(buffer); -} - } // namespace models } // namespace data } // namespace ra diff --git a/src/data/models/LeaderboardModel.hh b/src/data/models/LeaderboardModel.hh index 0967fe2f..c57bf604 100644 --- a/src/data/models/LeaderboardModel.hh +++ b/src/data/models/LeaderboardModel.hh @@ -4,7 +4,7 @@ #include "data/models/AssetModelBase.hh" -#include "data\Types.hh" +#include "data/Value.hh" struct rc_client_leaderboard_info_t; struct rc_lboard_t; @@ -130,17 +130,12 @@ public: /// /// Gets the value format. /// - ValueFormat GetValueFormat() const { return ra::itoe(GetValue(ValueFormatProperty)); } + Value::Format GetValueFormat() const { return ra::itoe(GetValue(ValueFormatProperty)); } /// /// Sets the value format. /// - void SetValueFormat(ValueFormat nValue) { SetValue(ValueFormatProperty, ra::etoi(nValue)); } - - /// - /// Converts a raw score into a display string. - /// - std::string FormatScore(int nValue) const; + void SetValueFormat(Value::Format nValue) { SetValue(ValueFormatProperty, ra::etoi(nValue)); } /// /// The for whether or not lower values are better. diff --git a/src/devkit/RADevKit.vcxproj b/src/devkit/RADevKit.vcxproj index f8c0ad0b..44d9887f 100644 --- a/src/devkit/RADevKit.vcxproj +++ b/src/devkit/RADevKit.vcxproj @@ -72,6 +72,7 @@ + @@ -99,6 +100,7 @@ + diff --git a/src/devkit/RADevKit.vcxproj.filters b/src/devkit/RADevKit.vcxproj.filters index b62c4d49..86e4e544 100644 --- a/src/devkit/RADevKit.vcxproj.filters +++ b/src/devkit/RADevKit.vcxproj.filters @@ -167,6 +167,7 @@ + @@ -227,5 +228,6 @@ data\models + \ No newline at end of file diff --git a/src/devkit/data/Value.cpp b/src/devkit/data/Value.cpp new file mode 100644 index 00000000..8d0506ad --- /dev/null +++ b/src/devkit/data/Value.cpp @@ -0,0 +1,134 @@ +#include "Value.hh" + +#include "util/Strings.hh" + +#include + +namespace ra { +namespace data { + +const char* Value::FormatToServerEnum(Format nFormat) noexcept +{ + switch (nFormat) + { + case Format::Centiseconds: + return "MILLISECS"; + case Format::Frames: + return "TIME"; + case Format::Minutes: + return "MINUTES"; + case Format::Score: + return "SCORE"; + case Format::Seconds: + return "TIMESECS"; + case Format::SecondsAsMinutes: + return "SECS_AS_MINS"; + case Format::Value: + return "VALUE"; + case Format::Float1: + return "FLOAT1"; + case Format::Float2: + return "FLOAT2"; + case Format::Float3: + return "FLOAT3"; + case Format::Float4: + return "FLOAT4"; + case Format::Float5: + return "FLOAT5"; + case Format::Float6: + return "FLOAT6"; + case Format::Fixed1: + return "FIXED1"; + case Format::Fixed2: + return "FIXED2"; + case Format::Fixed3: + return "FIXED3"; + case Format::Tens: + return "TENS"; + case Format::Hundreds: + return "HUNDREDS"; + case Format::Thousands: + return "THOUSANDS"; + case Format::UnsignedValue: + return "UNSIGNED"; + default: + return "UNKNOWN"; + } +} + +Value::Format Value::FormatFromServerEnum(const std::string& sFormat) noexcept +{ + return FormatFromRcheevosFormat(gsl::narrow_cast(rc_parse_format(sFormat.c_str()))); +} + +Value::Format Value::FormatFromRcheevosFormat(uint8_t nFormat) noexcept +{ + switch (nFormat) + { + case RC_FORMAT_FRAMES: return Format::Frames; + case RC_FORMAT_SECONDS: return Format::Seconds; + case RC_FORMAT_CENTISECS: return Format::Centiseconds; + case RC_FORMAT_SCORE: return Format::Score; + case RC_FORMAT_VALUE: return Format::Value; + case RC_FORMAT_MINUTES: return Format::Minutes; + case RC_FORMAT_SECONDS_AS_MINUTES: return Format::SecondsAsMinutes; + case RC_FORMAT_FLOAT1: return Format::Float1; + case RC_FORMAT_FLOAT2: return Format::Float2; + case RC_FORMAT_FLOAT3: return Format::Float3; + case RC_FORMAT_FLOAT4: return Format::Float4; + case RC_FORMAT_FLOAT5: return Format::Float5; + case RC_FORMAT_FLOAT6: return Format::Float6; + case RC_FORMAT_FIXED1: return Format::Fixed1; + case RC_FORMAT_FIXED2: return Format::Fixed2; + case RC_FORMAT_FIXED3: return Format::Fixed3; + case RC_FORMAT_TENS: return Format::Tens; + case RC_FORMAT_HUNDREDS: return Format::Hundreds; + case RC_FORMAT_THOUSANDS: return Format::Thousands; + case RC_FORMAT_UNSIGNED_VALUE: return Format::UnsignedValue; + case RC_FORMAT_UNFORMATTED: return Format::Unformatted; + default: + assert(!"Unsupported value format"); + return Format::Value; + } +} + +uint8_t Value::FormatToRcheevosFormat(Format nFormat) noexcept +{ + switch (nFormat) + { + case Format::Frames: return RC_FORMAT_FRAMES; + case Format::Seconds: return RC_FORMAT_SECONDS; + case Format::Centiseconds: return RC_FORMAT_CENTISECS; + case Format::Score: return RC_FORMAT_SCORE; + case Format::Value: return RC_FORMAT_VALUE; + case Format::Minutes: return RC_FORMAT_MINUTES; + case Format::SecondsAsMinutes: return RC_FORMAT_SECONDS_AS_MINUTES; + case Format::Float1: return RC_FORMAT_FLOAT1; + case Format::Float2: return RC_FORMAT_FLOAT2; + case Format::Float3: return RC_FORMAT_FLOAT3; + case Format::Float4: return RC_FORMAT_FLOAT4; + case Format::Float5: return RC_FORMAT_FLOAT5; + case Format::Float6: return RC_FORMAT_FLOAT6; + case Format::Fixed1: return RC_FORMAT_FIXED1; + case Format::Fixed2: return RC_FORMAT_FIXED2; + case Format::Fixed3: return RC_FORMAT_FIXED3; + case Format::Tens: return RC_FORMAT_TENS; + case Format::Hundreds: return RC_FORMAT_HUNDREDS; + case Format::Thousands: return RC_FORMAT_THOUSANDS; + case Format::UnsignedValue: return RC_FORMAT_UNSIGNED_VALUE; + case Format::Unformatted: return RC_FORMAT_UNFORMATTED; + default: + assert(!"Unsupported value format"); + return RC_FORMAT_VALUE; + } +} + +std::wstring Value::FormatValue(int32_t nValue, Format nFormat) +{ + char buffer[32]; + rc_format_value(buffer, sizeof(buffer), nValue, FormatToRcheevosFormat(nFormat)); + return ra::util::String::Widen(buffer); +} + +} // namespace data +} // namespace ra diff --git a/src/devkit/data/Value.hh b/src/devkit/data/Value.hh new file mode 100644 index 00000000..b65b5967 --- /dev/null +++ b/src/devkit/data/Value.hh @@ -0,0 +1,203 @@ +#ifndef RA_DATA_VALUE_H +#define RA_DATA_VALUE_H +#pragma once + +#include +#include + +namespace ra { +namespace data { + +class Value { +public: + enum class Format : uint8_t + { + /// + /// Value (in sixtieths of a second) converted to minutes/seconds/hundredths - %02d:%02d.%02d + /// + Frames, + + /// + /// Value (in seconds) converted to minutes/seconds - %02d:%02d + /// + Seconds, + + /// + /// Value (in hundredths of a second) converted to minutes/seconds/hundredths - %02d:%02d.%02d + /// + Centiseconds, + + /// + /// Generic value padded with 0s to 6 digits (1234 => 001234) + /// + Score, + + /// + /// Generic value with commas (1234 => 1,234) + /// + Value, + + /// + /// Value (in minutes) converted to hours/minutes - %dh%02d + /// + Minutes, + + /// + /// Value (in seconds) converted to hours/minutes - %dh%02d + /// + SecondsAsMinutes, + + /// + /// A floating point value with one digit after the decimal (3.1) + /// + Float1, + + /// + /// A floating point value with two digits after the decimal (3.14) + /// + Float2, + + /// + /// A floating point value with three digits after the decimal (3.141) + /// + Float3, + + /// + /// A floating point value with four digits after the decimal (3.1416) + /// + Float4, + + /// + /// A floating point value with five digits after the decimal (3.14159) + /// + Float5, + + /// + /// A floating point value with six digits after the decimal (3.141593) + /// + Float6, + + /// + /// A fixed-point value with one digit after the decimal (12345 => 1,234.5) + /// + Fixed1, + + /// + /// A fixed-point value with two digits after the decimal (12345 => 123.45) + /// + Fixed2, + + /// + /// A fixed-point value with three digits after the decimal (12345 => 12.345) + /// + Fixed3, + + /// + /// A number padded with a trailing zero (123 => 1,230) + /// + Tens, + + /// + /// A number padded with two trailing zeroes (123 => 12,300) + /// + Hundreds, + + /// + /// A number padded with three trailing zeroes (123 => 123,000) + /// + Thousands, + + /// + /// Generic unsigned value (1234 => 1,234) + /// + UnsignedValue, + + /// + /// Generic value without commas (1234 => 1234) + /// + Unformatted, + }; + + /// + /// Gets a string representation of the format (as displayed to the user). + /// + static constexpr const wchar_t* FormatString(Format nFormat) noexcept + { + switch (nFormat) + { + case Format::Centiseconds: + return L"Time (Centiseconds)"; + case Format::Frames: + return L"Time (Frames)"; + case Format::Minutes: + return L"Time (Minutes)"; + case Format::Score: + return L"Score"; + case Format::Seconds: + return L"Time (Seconds)"; + case Format::SecondsAsMinutes: + return L"Time (Seconds as Minutes)"; + case Format::Value: + return L"Value"; + case Format::Float1: + return L"Value (Float1)"; + case Format::Float2: + return L"Value (Float2)"; + case Format::Float3: + return L"Value (Float3)"; + case Format::Float4: + return L"Value (Float4)"; + case Format::Float5: + return L"Value (Float5)"; + case Format::Float6: + return L"Value (Float6)"; + case Format::Fixed1: + return L"Value (Fixed1)"; + case Format::Fixed2: + return L"Value (Fixed2)"; + case Format::Fixed3: + return L"Value (Fixed3)"; + case Format::Tens: + return L"Value (Tens)"; + case Format::Hundreds: + return L"Value (Hundreds)"; + case Format::Thousands: + return L"Value (Thousands)"; + case Format::UnsignedValue: + return L"Value (Unsigned)"; + default: + return L"Unknown"; + } + } + + /// + /// Gets the server enum for a format. + /// + static const char* FormatToServerEnum(Format nFormat) noexcept; + + /// + /// Gets the format from a server enum. + /// + /// Returns Format::Value for unknown formats + static Format FormatFromServerEnum(const std::string& sFormat) noexcept; + + /// + /// Converts an RC_FORMAT_ value to a Value::Type value. + /// + static Format FormatFromRcheevosFormat(uint8_t nFormat) noexcept; + + /// + /// Converts a Value::Type value to an RC_FORMAT_ value. + /// + static uint8_t FormatToRcheevosFormat(Format nFormat) noexcept; + + /// + /// Converts a value to a string using the specified format. + /// + static std::wstring FormatValue(int32_t nValue, Format nFormat); +}; + +} // namespace data +} // namespace ra + +#endif RA_DATA_MEMORY_H diff --git a/src/ui/viewmodels/AssetEditorViewModel.cpp b/src/ui/viewmodels/AssetEditorViewModel.cpp index ad8e3a9b..139cb49b 100644 --- a/src/ui/viewmodels/AssetEditorViewModel.cpp +++ b/src/ui/viewmodels/AssetEditorViewModel.cpp @@ -34,7 +34,7 @@ const StringModelProperty AssetEditorViewModel::BadgeProperty("AssetEditorViewMo const BoolModelProperty AssetEditorViewModel::IsLeaderboardProperty("AssetEditorViewModel", "IsLeaderboard", false); const IntModelProperty AssetEditorViewModel::SelectedLeaderboardPartProperty("AssetEditorViewModel", "SelectedLeaderboardPart", ra::etoi(AssetEditorViewModel::LeaderboardPart::Start)); const StringModelProperty AssetEditorViewModel::GroupsHeaderProperty("AssetEditorViewModel", "GroupsHeader", L"Groups:"); -const IntModelProperty AssetEditorViewModel::ValueFormatProperty("AssetEditorViewModel", "ValueFormat", ra::etoi(ra::data::ValueFormat::Value)); +const IntModelProperty AssetEditorViewModel::ValueFormatProperty("AssetEditorViewModel", "ValueFormat", ra::etoi(ra::data::Value::Format::Value)); const BoolModelProperty AssetEditorViewModel::LowerIsBetterProperty("AssetEditorViewModel", "LowerIsBetter", false); const StringModelProperty AssetEditorViewModel::FormattedValueProperty("AssetEditorViewModel", "FormattedValue", L"0"); const BoolModelProperty AssetEditorViewModel::PauseOnResetProperty("AssetEditorViewModel", "PauseOnReset", false); @@ -63,21 +63,23 @@ AssetEditorViewModel::AssetEditorViewModel() noexcept m_vAchievementTypes.Add(ra::etoi(ra::data::models::AchievementType::Missable), L"Missable"); m_vAchievementTypes.Add(ra::etoi(ra::data::models::AchievementType::Progression), L"Progression"); m_vAchievementTypes.Add(ra::etoi(ra::data::models::AchievementType::Win), L"Win"); - - m_vFormats.Add(ra::etoi(ra::data::ValueFormat::Score), L"Score"); - m_vFormats.Add(ra::etoi(ra::data::ValueFormat::Frames), L"Time (Frames)"); - m_vFormats.Add(ra::etoi(ra::data::ValueFormat::Centiseconds), L"Time (Centiseconds)"); - m_vFormats.Add(ra::etoi(ra::data::ValueFormat::Seconds), L"Time (Seconds)"); - m_vFormats.Add(ra::etoi(ra::data::ValueFormat::Minutes), L"Time (Minutes)"); - m_vFormats.Add(ra::etoi(ra::data::ValueFormat::SecondsAsMinutes), L"Time (Seconds as Minutes)"); - m_vFormats.Add(ra::etoi(ra::data::ValueFormat::Value), L"Value"); - m_vFormats.Add(ra::etoi(ra::data::ValueFormat::UnsignedValue), L"Value (Unsigned)"); - m_vFormats.Add(ra::etoi(ra::data::ValueFormat::Tens), L"Value (Tens)"); - m_vFormats.Add(ra::etoi(ra::data::ValueFormat::Hundreds), L"Value (Hundreds)"); - m_vFormats.Add(ra::etoi(ra::data::ValueFormat::Thousands), L"Value (Thousands)"); - m_vFormats.Add(ra::etoi(ra::data::ValueFormat::Fixed1), L"Value (Fixed1)"); - m_vFormats.Add(ra::etoi(ra::data::ValueFormat::Fixed2), L"Value (Fixed2)"); - m_vFormats.Add(ra::etoi(ra::data::ValueFormat::Fixed3), L"Value (Fixed3)"); + m_vAchievementTypes.Freeze(); + + m_vFormats.Add(ra::etoi(ra::data::Value::Format::Score), ra::data::Value::FormatString(ra::data::Value::Format::Score)); + m_vFormats.Add(ra::etoi(ra::data::Value::Format::Frames), ra::data::Value::FormatString(ra::data::Value::Format::Frames)); + m_vFormats.Add(ra::etoi(ra::data::Value::Format::Centiseconds), ra::data::Value::FormatString(ra::data::Value::Format::Centiseconds)); + m_vFormats.Add(ra::etoi(ra::data::Value::Format::Seconds), ra::data::Value::FormatString(ra::data::Value::Format::Seconds)); + m_vFormats.Add(ra::etoi(ra::data::Value::Format::Minutes), ra::data::Value::FormatString(ra::data::Value::Format::Minutes)); + m_vFormats.Add(ra::etoi(ra::data::Value::Format::SecondsAsMinutes), ra::data::Value::FormatString(ra::data::Value::Format::SecondsAsMinutes)); + m_vFormats.Add(ra::etoi(ra::data::Value::Format::Value), ra::data::Value::FormatString(ra::data::Value::Format::Value)); + m_vFormats.Add(ra::etoi(ra::data::Value::Format::UnsignedValue), ra::data::Value::FormatString(ra::data::Value::Format::UnsignedValue)); + m_vFormats.Add(ra::etoi(ra::data::Value::Format::Tens), ra::data::Value::FormatString(ra::data::Value::Format::Tens)); + m_vFormats.Add(ra::etoi(ra::data::Value::Format::Hundreds), ra::data::Value::FormatString(ra::data::Value::Format::Hundreds)); + m_vFormats.Add(ra::etoi(ra::data::Value::Format::Thousands), ra::data::Value::FormatString(ra::data::Value::Format::Thousands)); + m_vFormats.Add(ra::etoi(ra::data::Value::Format::Fixed1), ra::data::Value::FormatString(ra::data::Value::Format::Fixed1)); + m_vFormats.Add(ra::etoi(ra::data::Value::Format::Fixed2), ra::data::Value::FormatString(ra::data::Value::Format::Fixed2)); + m_vFormats.Add(ra::etoi(ra::data::Value::Format::Fixed3), ra::data::Value::FormatString(ra::data::Value::Format::Fixed3)); + m_vFormats.Freeze(); m_vLeaderboardParts.Add(ra::etoi(LeaderboardPart::Start), L"Start"); m_vLeaderboardParts.Add(ra::etoi(LeaderboardPart::Cancel), L"Cancel"); @@ -425,7 +427,7 @@ void AssetEditorViewModel::OnDataModelIntValueChanged(const IntModelProperty::Ch else if (args.Property == ra::data::models::AchievementModel::AchievementTypeProperty) SetAchievementType(ra::itoe(args.tNewValue)); else if (args.Property == ra::data::models::LeaderboardModel::ValueFormatProperty) - SetValueFormat(ra::itoe(args.tNewValue)); + SetValueFormat(ra::itoe(args.tNewValue)); else if (args.Property == ra::data::models::AssetModelBase::IDProperty) SetValue(IDProperty, args.tNewValue); } @@ -594,7 +596,7 @@ void AssetEditorViewModel::OnValueChanged(const IntModelProperty::ChangeArgs& ar } else if (args.Property == ValueFormatProperty) { - pLeaderboard->SetValueFormat(ra::itoe(args.tNewValue)); + pLeaderboard->SetValueFormat(ra::itoe(args.tNewValue)); UpdateMeasuredValue(); } } @@ -1063,10 +1065,7 @@ void AssetEditorViewModel::UpdateMeasuredValue() { const unsigned nValue = pLeaderboardDefinition->value.value.value; SetValue(MeasuredValueProperty, std::to_wstring(nValue)); - - char buffer[16]; - rc_format_value(buffer, sizeof(buffer), nValue, ra::etoi(GetValueFormat())); - SetValue(FormattedValueProperty, ra::util::String::Widen(buffer)); + SetValue(FormattedValueProperty, ra::data::Value::FormatValue(nValue, GetValueFormat())); } } } diff --git a/src/ui/viewmodels/AssetEditorViewModel.hh b/src/ui/viewmodels/AssetEditorViewModel.hh index 63cc1398..5f486868 100644 --- a/src/ui/viewmodels/AssetEditorViewModel.hh +++ b/src/ui/viewmodels/AssetEditorViewModel.hh @@ -4,7 +4,7 @@ #include "TriggerViewModel.hh" -#include "data\Types.hh" +#include "data\Value.hh" #include "data\context\EmulatorContext.hh" #include "data\models\AchievementModel.hh" #include "data\models\AssetModelBase.hh" @@ -248,12 +248,12 @@ public: /// /// Gets the asset value format. /// - ra::data::ValueFormat GetValueFormat() const { return ra::itoe(GetValue(ValueFormatProperty)); } + ra::data::Value::Format GetValueFormat() const { return ra::itoe(GetValue(ValueFormatProperty)); } /// /// Sets the asset value format. /// - void SetValueFormat(ra::data::ValueFormat nValue) { SetValue(ValueFormatProperty, ra::etoi(nValue)); } + void SetValueFormat(ra::data::Value::Format nValue) { SetValue(ValueFormatProperty, ra::etoi(nValue)); } /// /// Gets the list of leaderboard formats. diff --git a/tests/data/DataAsserts.hh b/tests/data/DataAsserts.hh index e1cd782a..5286005c 100644 --- a/tests/data/DataAsserts.hh +++ b/tests/data/DataAsserts.hh @@ -45,30 +45,6 @@ std::wstring ToString(const ra::data } } -template<> -std::wstring ToString(const ra::data::ValueFormat& nFormat) -{ - switch (nFormat) - { - case ra::data::ValueFormat::Score: - return L"Score"; - case ra::data::ValueFormat::Value: - return L"Value"; - case ra::data::ValueFormat::Frames: - return L"Frames"; - case ra::data::ValueFormat::Centiseconds: - return L"Centiseconds"; - case ra::data::ValueFormat::Seconds: - return L"Seconds"; - case ra::data::ValueFormat::Minutes: - return L"Minutes"; - case ra::data::ValueFormat::SecondsAsMinutes: - return L"SecondsAsMinutes"; - default: - return std::to_wstring(ra::etoi(nFormat)); - } -} - template<> std::wstring ToString(const ra::data::models::LeaderboardModel::LeaderboardParts& nParts) { diff --git a/tests/data/context/GameAssets_Tests.cpp b/tests/data/context/GameAssets_Tests.cpp index 390877fd..52f48ce9 100644 --- a/tests/data/context/GameAssets_Tests.cpp +++ b/tests/data/context/GameAssets_Tests.cpp @@ -6,10 +6,10 @@ #include "data\models\LocalBadgesModel.hh" #include "tests\RA_UnitTestHelpers.h" -#include "tests\data\DataAsserts.hh" #include "tests\devkit\context\mocks\MockRcClient.hh" #include "tests\devkit\services\mocks\MockLocalStorage.hh" #include "tests\devkit\testutil\AssetAsserts.hh" +#include "tests\devkit\testutil\ValueAsserts.hh" #include "tests\mocks\MockAchievementRuntime.hh" #include "tests\mocks\MockGameContext.hh" @@ -114,7 +114,7 @@ TEST_CLASS(GameAssets_Tests) ra::data::models::LeaderboardModel& AddLeaderboard(AssetCategory nCategory, const std::wstring& sTitle, const std::wstring& sDescription, const std::string& sStart, - const std::string& sCancel, const std::string& sSubmit, const std::string& sValue, ValueFormat nFormat) + const std::string& sCancel, const std::string& sSubmit, const std::string& sValue, Value::Format nFormat) { auto& pLeaderboard = NewLeaderboard(); pLeaderboard.SetCategory(nCategory); @@ -748,8 +748,8 @@ TEST_CLASS(GameAssets_Tests) TEST_METHOD(TestSaveLocalLeaderboard) { GameAssetsHarness gameAssets; - gameAssets.AddLeaderboard(AssetCategory::Core, L"LB1", L"Desc1", "0xH1234=1", "0xH1234=2", "0xH1234=3", "M:0xH1235", ValueFormat::Seconds); - gameAssets.AddLeaderboard(AssetCategory::Local, L"LB2", L"Desc2", "0xH2234=1", "0xH2234=2", "0xH2234=3", "M:0xH2235", ValueFormat::Minutes); + gameAssets.AddLeaderboard(AssetCategory::Core, L"LB1", L"Desc1", "0xH1234=1", "0xH1234=2", "0xH1234=3", "M:0xH1235", Value::Format::Seconds); + gameAssets.AddLeaderboard(AssetCategory::Local, L"LB2", L"Desc2", "0xH2234=1", "0xH2234=2", "0xH2234=3", "M:0xH2235", Value::Format::Minutes); gameAssets.SaveAllAssets(); @@ -761,7 +761,7 @@ TEST_CLASS(GameAssets_Tests) { GameAssetsHarness gameAssets; gameAssets.AddThreeAchievements(); - gameAssets.AddLeaderboard(AssetCategory::Core, L"LB1", L"Desc1", "0xH1234=1", "0xH1234=2", "0xH1234=3", "M:0xH1235", ValueFormat::Seconds); + gameAssets.AddLeaderboard(AssetCategory::Core, L"LB1", L"Desc1", "0xH1234=1", "0xH1234=2", "0xH1234=3", "M:0xH1235", Value::Format::Seconds); gameAssets.MockUserFileContents( "111000001:\"0xH1234=0\":Test:::::User:0:0:0:::00000\n" "L111000002:\"0xH2234=1\":\"0xH2234=2\":\"0xH2234=3\":\"M:0xH2235\":MINUTES:LB2:Desc2\n"); @@ -784,7 +784,7 @@ TEST_CLASS(GameAssets_Tests) Assert::AreEqual(std::string("0xH2234=2"), pAsset2->GetCancelTrigger()); Assert::AreEqual(std::string("0xH2234=3"), pAsset2->GetSubmitTrigger()); Assert::AreEqual(std::string("M:0xH2235"), pAsset2->GetValueDefinition()); - Assert::AreEqual(ValueFormat::Minutes, pAsset2->GetValueFormat()); + Assert::AreEqual(Value::Format::Minutes, pAsset2->GetValueFormat()); Assert::AreEqual(AssetCategory::Local, pAsset->GetCategory()); Assert::AreEqual(AssetChanges::Unpublished, pAsset2->GetChanges()); } diff --git a/tests/data/models/LeaderboardModel_Tests.cpp b/tests/data/models/LeaderboardModel_Tests.cpp index 6e777e5e..e27d229f 100644 --- a/tests/data/models/LeaderboardModel_Tests.cpp +++ b/tests/data/models/LeaderboardModel_Tests.cpp @@ -5,10 +5,10 @@ #include "services\impl\StringTextWriter.hh" #include "tests\RA_UnitTestHelpers.h" -#include "tests\data\DataAsserts.hh" #include "tests\devkit\context\mocks\MockRcClient.hh" #include "tests\devkit\testutil\AssetAsserts.hh" +#include "tests\devkit\testutil\ValueAsserts.hh" #include "tests\mocks\MockAchievementRuntime.hh" #include "tests\mocks\MockGameContext.hh" @@ -65,7 +65,7 @@ TEST_CLASS(LeaderboardModel_Tests) Assert::AreEqual(std::string("0xH1234=2"), leaderboard.GetCancelTrigger()); Assert::AreEqual(std::string("0xH1234=3"), leaderboard.GetSubmitTrigger()); Assert::AreEqual(std::string("0xH1234"), leaderboard.GetValueDefinition()); - Assert::AreEqual(ValueFormat::Frames, leaderboard.GetValueFormat()); + Assert::AreEqual(Value::Format::Frames, leaderboard.GetValueFormat()); Assert::AreEqual(std::wstring(L"Title"), leaderboard.GetName()); Assert::AreEqual(std::wstring(L"Desc"), leaderboard.GetDescription()); Assert::IsFalse(leaderboard.IsLowerBetter()); @@ -85,7 +85,7 @@ TEST_CLASS(LeaderboardModel_Tests) Assert::AreEqual(std::string("0xH1234<2"), leaderboard.GetCancelTrigger()); Assert::AreEqual(std::string("0xH1234>3"), leaderboard.GetSubmitTrigger()); Assert::AreEqual(std::string("M:0xH1234"), leaderboard.GetValueDefinition()); - Assert::AreEqual(ValueFormat::Centiseconds, leaderboard.GetValueFormat()); + Assert::AreEqual(Value::Format::Centiseconds, leaderboard.GetValueFormat()); Assert::AreEqual(std::wstring(L"My Title"), leaderboard.GetName()); Assert::AreEqual(std::wstring(L"My Desc"), leaderboard.GetDescription()); Assert::IsTrue(leaderboard.IsLowerBetter()); @@ -105,7 +105,7 @@ TEST_CLASS(LeaderboardModel_Tests) Assert::AreEqual(std::string("0xH1234=2"), leaderboard.GetCancelTrigger()); Assert::AreEqual(std::string("0xH1234=3"), leaderboard.GetSubmitTrigger()); Assert::AreEqual(std::string("0xH1234"), leaderboard.GetValueDefinition()); - Assert::AreEqual(ValueFormat::Frames, leaderboard.GetValueFormat()); + Assert::AreEqual(Value::Format::Frames, leaderboard.GetValueFormat()); Assert::AreEqual(std::wstring(L"Title"), leaderboard.GetName()); Assert::AreEqual(std::wstring(L"Desc"), leaderboard.GetDescription()); Assert::IsFalse(leaderboard.IsLowerBetter()); @@ -125,13 +125,13 @@ TEST_CLASS(LeaderboardModel_Tests) Assert::AreEqual(std::string(), leaderboard.GetCancelTrigger()); Assert::AreEqual(std::string(), leaderboard.GetSubmitTrigger()); Assert::AreEqual(std::string(), leaderboard.GetValueDefinition()); - Assert::AreEqual(ValueFormat::Value, leaderboard.GetValueFormat()); + Assert::AreEqual(Value::Format::Value, leaderboard.GetValueFormat()); Assert::AreEqual(std::wstring(), leaderboard.GetName()); Assert::AreEqual(std::wstring(), leaderboard.GetDescription()); Assert::IsFalse(leaderboard.IsLowerBetter()); } - void TestSerializeValueFormat(ValueFormat nFormat, const std::string& sFormat) + void TestSerializeValueFormat(Value::Format nFormat, const std::string& sFormat) { LeaderboardModelHarness leaderboard; leaderboard.SetID(1U); @@ -159,20 +159,20 @@ TEST_CLASS(LeaderboardModel_Tests) TEST_METHOD(TestSerializeValueFormats) { - TestSerializeValueFormat(ValueFormat::Score, "SCORE"); - TestSerializeValueFormat(ValueFormat::Value, "VALUE"); - TestSerializeValueFormat(ValueFormat::Frames, "TIME"); - TestSerializeValueFormat(ValueFormat::Centiseconds, "MILLISECS"); - TestSerializeValueFormat(ValueFormat::Seconds, "TIMESECS"); - TestSerializeValueFormat(ValueFormat::Minutes, "MINUTES"); - TestSerializeValueFormat(ValueFormat::SecondsAsMinutes, "SECS_AS_MINS"); - TestSerializeValueFormat(ValueFormat::Fixed1, "FIXED1"); - TestSerializeValueFormat(ValueFormat::Fixed2, "FIXED2"); - TestSerializeValueFormat(ValueFormat::Fixed3, "FIXED3"); - TestSerializeValueFormat(ValueFormat::Tens, "TENS"); - TestSerializeValueFormat(ValueFormat::Hundreds, "HUNDREDS"); - TestSerializeValueFormat(ValueFormat::Thousands, "THOUSANDS"); - TestSerializeValueFormat(ValueFormat::UnsignedValue, "UNSIGNED"); + TestSerializeValueFormat(Value::Format::Score, "SCORE"); + TestSerializeValueFormat(Value::Format::Value, "VALUE"); + TestSerializeValueFormat(Value::Format::Frames, "TIME"); + TestSerializeValueFormat(Value::Format::Centiseconds, "MILLISECS"); + TestSerializeValueFormat(Value::Format::Seconds, "TIMESECS"); + TestSerializeValueFormat(Value::Format::Minutes, "MINUTES"); + TestSerializeValueFormat(Value::Format::SecondsAsMinutes, "SECS_AS_MINS"); + TestSerializeValueFormat(Value::Format::Fixed1, "FIXED1"); + TestSerializeValueFormat(Value::Format::Fixed2, "FIXED2"); + TestSerializeValueFormat(Value::Format::Fixed3, "FIXED3"); + TestSerializeValueFormat(Value::Format::Tens, "TENS"); + TestSerializeValueFormat(Value::Format::Hundreds, "HUNDREDS"); + TestSerializeValueFormat(Value::Format::Thousands, "THOUSANDS"); + TestSerializeValueFormat(Value::Format::UnsignedValue, "UNSIGNED"); } TEST_METHOD(TestTransactionalProperties) @@ -182,17 +182,17 @@ TEST_CLASS(LeaderboardModel_Tests) leaderboard.SetName(L"Title"); leaderboard.SetDescription(L"Desc"); leaderboard.SetDefinition("STA:0xH1234=1::SUB:0xH1234=2::CAN:0xH1234=3::VAL:0xH1234"); - leaderboard.SetValueFormat(ValueFormat::Value); + leaderboard.SetValueFormat(Value::Format::Value); leaderboard.SetLowerIsBetter(true); leaderboard.CreateServerCheckpoint(); leaderboard.CreateLocalCheckpoint(); Assert::AreEqual(AssetChanges::None, leaderboard.GetChanges()); - leaderboard.SetValueFormat(ValueFormat::Score); + leaderboard.SetValueFormat(Value::Format::Score); Assert::AreEqual(AssetChanges::Modified, leaderboard.GetChanges()); - leaderboard.SetValueFormat(ValueFormat::Value); + leaderboard.SetValueFormat(Value::Format::Value); Assert::AreEqual(AssetChanges::None, leaderboard.GetChanges()); leaderboard.SetLowerIsBetter(false); @@ -208,7 +208,7 @@ TEST_CLASS(LeaderboardModel_Tests) leaderboard.SetID(1U); leaderboard.SetName(L"Title"); leaderboard.SetDescription(L"Desc"); - leaderboard.SetValueFormat(ValueFormat::Value); + leaderboard.SetValueFormat(Value::Format::Value); leaderboard.SetLowerIsBetter(true); leaderboard.CreateServerCheckpoint(); leaderboard.CreateLocalCheckpoint(); @@ -240,7 +240,7 @@ TEST_CLASS(LeaderboardModel_Tests) leaderboard.SetName(L"Title"); leaderboard.SetDescription(L"Desc"); leaderboard.SetDefinition("STA:N:0xH1234=1::SUB:N:0xH1234=2::CAN:N:0xH1234=3::VAL:0xH1234"); - leaderboard.SetValueFormat(ValueFormat::Value); + leaderboard.SetValueFormat(Value::Format::Value); leaderboard.SetLowerIsBetter(true); leaderboard.CreateServerCheckpoint(); leaderboard.CreateLocalCheckpoint(); @@ -268,7 +268,7 @@ TEST_CLASS(LeaderboardModel_Tests) leaderboard.SetName(L"Title"); leaderboard.SetDescription(L"Desc"); leaderboard.SetDefinition("STA:0xH1234=1::SUB:0xH1234=2::CAN:0xH1234=3::VAL:0xH1234"); - leaderboard.SetValueFormat(ValueFormat::Value); + leaderboard.SetValueFormat(Value::Format::Value); leaderboard.SetLowerIsBetter(true); leaderboard.CreateServerCheckpoint(); leaderboard.CreateLocalCheckpoint(); @@ -304,7 +304,7 @@ TEST_CLASS(LeaderboardModel_Tests) leaderboard.SetName(L"Title"); leaderboard.SetDescription(L"Desc"); leaderboard.SetDefinition("STA:0xH1234=1::SUB:0xH1234=2::CAN:0xH1234=3::VAL:0xH1234"); - leaderboard.SetValueFormat(ValueFormat::Value); + leaderboard.SetValueFormat(Value::Format::Value); leaderboard.SetLowerIsBetter(true); leaderboard.CreateServerCheckpoint(); leaderboard.CreateLocalCheckpoint(); @@ -340,7 +340,7 @@ TEST_CLASS(LeaderboardModel_Tests) leaderboard.SetName(L"Title"); leaderboard.SetDescription(L"Desc"); leaderboard.SetDefinition("STA:0xH1234=1::SUB:0xH1234=2::CAN:0xH1234=3::VAL:0xH1234"); - leaderboard.SetValueFormat(ValueFormat::Value); + leaderboard.SetValueFormat(Value::Format::Value); leaderboard.SetLowerIsBetter(true); leaderboard.CreateServerCheckpoint(); leaderboard.CreateLocalCheckpoint(); @@ -379,7 +379,7 @@ TEST_CLASS(LeaderboardModel_Tests) leaderboard.SetName(L"Title"); leaderboard.SetDescription(L"Desc"); leaderboard.SetDefinition("STA:0xH1234=1::SUB:0xH1234=2::CAN:0xH1234=3::VAL:0xH1234"); - leaderboard.SetValueFormat(ValueFormat::Value); + leaderboard.SetValueFormat(Value::Format::Value); leaderboard.SetLowerIsBetter(true); leaderboard.CreateServerCheckpoint(); leaderboard.CreateLocalCheckpoint(); diff --git a/tests/devkit/RADevKit.Tests.vcxproj b/tests/devkit/RADevKit.Tests.vcxproj index 3b3b406e..e35c703b 100644 --- a/tests/devkit/RADevKit.Tests.vcxproj +++ b/tests/devkit/RADevKit.Tests.vcxproj @@ -98,6 +98,7 @@ + \ No newline at end of file diff --git a/tests/devkit/RADevKit.Tests.vcxproj.filters b/tests/devkit/RADevKit.Tests.vcxproj.filters index e7e58223..08e1d12b 100644 --- a/tests/devkit/RADevKit.Tests.vcxproj.filters +++ b/tests/devkit/RADevKit.Tests.vcxproj.filters @@ -146,5 +146,8 @@ services\mocks + + testutil + \ No newline at end of file diff --git a/tests/devkit/testutil/AssetAsserts.hh b/tests/devkit/testutil/AssetAsserts.hh index 4d3c0822..ed764d00 100644 --- a/tests/devkit/testutil/AssetAsserts.hh +++ b/tests/devkit/testutil/AssetAsserts.hh @@ -4,8 +4,9 @@ #include "CppUnitTest.hh" -#include "data\models\AssetModelBase.hh" -#include "util\TypeCasts.hh" +#include "data/models/AssetModelBase.hh" + +#include "util/TypeCasts.hh" namespace Microsoft { namespace VisualStudio { diff --git a/tests/devkit/testutil/CppUnitTest.hh b/tests/devkit/testutil/CppUnitTest.hh index 090ff7c8..85234a22 100644 --- a/tests/devkit/testutil/CppUnitTest.hh +++ b/tests/devkit/testutil/CppUnitTest.hh @@ -2,7 +2,7 @@ #define RA_CPP_UNIT_TEST_HH /* completely suppress everything inside the CppUnitTest.h file */ -#include +#include #pragma warning(push) #pragma warning(disable: ALL_CPPCORECHECK_WARNINGS ALL_CODE_ANALYSIS_WARNINGS) #include diff --git a/tests/devkit/testutil/HttpAsserts.hh b/tests/devkit/testutil/HttpAsserts.hh index 35998ab5..0c758b08 100644 --- a/tests/devkit/testutil/HttpAsserts.hh +++ b/tests/devkit/testutil/HttpAsserts.hh @@ -4,9 +4,9 @@ #include "CppUnitTest.hh" -#include "services\Http.hh" +#include "services/Http.hh" -#include "util\TypeCasts.hh" +#include "util/TypeCasts.hh" namespace Microsoft { namespace VisualStudio { diff --git a/tests/devkit/testutil/MemoryAsserts.hh b/tests/devkit/testutil/MemoryAsserts.hh index c3bc2c12..b8dbbc73 100644 --- a/tests/devkit/testutil/MemoryAsserts.hh +++ b/tests/devkit/testutil/MemoryAsserts.hh @@ -4,8 +4,9 @@ #include "CppUnitTest.hh" -#include "data\Memory.hh" -#include "util\TypeCasts.hh" +#include "data/Memory.hh" + +#include "util/TypeCasts.hh" namespace Microsoft { namespace VisualStudio { diff --git a/tests/devkit/testutil/MemoryRegionAsserts.hh b/tests/devkit/testutil/MemoryRegionAsserts.hh index 58dd9f9c..78ee6bd6 100644 --- a/tests/devkit/testutil/MemoryRegionAsserts.hh +++ b/tests/devkit/testutil/MemoryRegionAsserts.hh @@ -4,8 +4,9 @@ #include "CppUnitTest.hh" -#include "data\MemoryRegion.hh" -#include "util\TypeCasts.hh" +#include "data/MemoryRegion.hh" + +#include "util/TypeCasts.hh" namespace Microsoft { namespace VisualStudio { diff --git a/tests/devkit/testutil/ValueAsserts.hh b/tests/devkit/testutil/ValueAsserts.hh new file mode 100644 index 00000000..3a4c959a --- /dev/null +++ b/tests/devkit/testutil/ValueAsserts.hh @@ -0,0 +1,79 @@ +#ifndef RA_VALUE_ASSERTS_H +#define RA_VALUE_ASSERTS_H +#pragma once + +#include "CppUnitTest.hh" + +#include "data/Value.hh" + +#include "util/TypeCasts.hh" + +namespace Microsoft { +namespace VisualStudio { +namespace CppUnitTestFramework { + +// converters for asserting enum values + +#pragma warning(push) +#pragma warning(disable : 4505) // unreferenced inline functions, they are referenced. Must be a bug. + +template<> +std::wstring ToString(const ra::data::Value::Format& nFormat) +{ + switch (nFormat) + { + case ra::data::Value::Format::Score: + return L"Score"; + case ra::data::Value::Format::Value: + return L"Value"; + case ra::data::Value::Format::Frames: + return L"Frames"; + case ra::data::Value::Format::Centiseconds: + return L"Centiseconds"; + case ra::data::Value::Format::Seconds: + return L"Seconds"; + case ra::data::Value::Format::Minutes: + return L"Minutes"; + case ra::data::Value::Format::SecondsAsMinutes: + return L"SecondsAsMinutes"; + case ra::data::Value::Format::Float1: + return L"Float1"; + case ra::data::Value::Format::Float2: + return L"Float2"; + case ra::data::Value::Format::Float3: + return L"Float3"; + case ra::data::Value::Format::Float4: + return L"Float4"; + case ra::data::Value::Format::Float5: + return L"Float5"; + case ra::data::Value::Format::Float6: + return L"Float6"; + case ra::data::Value::Format::Fixed1: + return L"Fixed1"; + case ra::data::Value::Format::Fixed2: + return L"Fixed2"; + case ra::data::Value::Format::Fixed3: + return L"Fixed3"; + case ra::data::Value::Format::Tens: + return L"Tens"; + case ra::data::Value::Format::Hundreds: + return L"Hundreds"; + case ra::data::Value::Format::Thousands: + return L"Thousands"; + case ra::data::Value::Format::UnsignedValue: + return L"UnsignedValue"; + case ra::data::Value::Format::Unformatted: + return L"Unformatted"; + default: + return std::to_wstring(ra::etoi(nFormat)); + } +} + + +#pragma warning(pop) + +} // namespace CppUnitTestFramework +} // namespace VisualStudio +} // namespace Microsoft + +#endif /* !RA_VALUE_ASSERTS_H */ diff --git a/tests/ui/viewmodels/AssetEditorViewModel_Tests.cpp b/tests/ui/viewmodels/AssetEditorViewModel_Tests.cpp index 52512ca7..96663dca 100644 --- a/tests/ui/viewmodels/AssetEditorViewModel_Tests.cpp +++ b/tests/ui/viewmodels/AssetEditorViewModel_Tests.cpp @@ -18,6 +18,7 @@ #include "tests\devkit\services\mocks\MockThreadPool.hh" #include "tests\devkit\testutil\AssetAsserts.hh" #include "tests\devkit\testutil\MemoryAsserts.hh" +#include "tests\devkit\testutil\ValueAsserts.hh" #include "tests\mocks\MockAchievementRuntime.hh" #include "tests\mocks\MockClipboard.hh" #include "tests\mocks\MockConfiguration.hh" @@ -142,7 +143,7 @@ TEST_CLASS(AssetEditorViewModel_Tests) Assert::IsFalse(editor.IsLeaderboard()); Assert::IsFalse(editor.IsTrigger()); Assert::AreEqual((int)AssetEditorViewModel::LeaderboardPart::Start, (int)editor.GetSelectedLeaderboardPart()); - Assert::AreEqual(ra::data::ValueFormat::Value, editor.GetValueFormat()); + Assert::AreEqual(ra::data::Value::Format::Value, editor.GetValueFormat()); Assert::AreEqual({ 4U }, editor.AchievementTypes().Count()); Assert::AreEqual((int)ra::data::models::AchievementType::None, editor.AchievementTypes().GetItemAt(0)->GetId()); @@ -155,33 +156,33 @@ TEST_CLASS(AssetEditorViewModel_Tests) Assert::AreEqual(std::wstring(L"Win"), editor.AchievementTypes().GetItemAt(3)->GetLabel()); Assert::AreEqual({ 14U }, editor.Formats().Count()); - Assert::AreEqual((int)ra::data::ValueFormat::Score, editor.Formats().GetItemAt(0)->GetId()); + Assert::AreEqual((int)ra::data::Value::Format::Score, editor.Formats().GetItemAt(0)->GetId()); Assert::AreEqual(std::wstring(L"Score"), editor.Formats().GetItemAt(0)->GetLabel()); - Assert::AreEqual((int)ra::data::ValueFormat::Frames, editor.Formats().GetItemAt(1)->GetId()); + Assert::AreEqual((int)ra::data::Value::Format::Frames, editor.Formats().GetItemAt(1)->GetId()); Assert::AreEqual(std::wstring(L"Time (Frames)"), editor.Formats().GetItemAt(1)->GetLabel()); - Assert::AreEqual((int)ra::data::ValueFormat::Centiseconds, editor.Formats().GetItemAt(2)->GetId()); + Assert::AreEqual((int)ra::data::Value::Format::Centiseconds, editor.Formats().GetItemAt(2)->GetId()); Assert::AreEqual(std::wstring(L"Time (Centiseconds)"), editor.Formats().GetItemAt(2)->GetLabel()); - Assert::AreEqual((int)ra::data::ValueFormat::Seconds, editor.Formats().GetItemAt(3)->GetId()); + Assert::AreEqual((int)ra::data::Value::Format::Seconds, editor.Formats().GetItemAt(3)->GetId()); Assert::AreEqual(std::wstring(L"Time (Seconds)"), editor.Formats().GetItemAt(3)->GetLabel()); - Assert::AreEqual((int)ra::data::ValueFormat::Minutes, editor.Formats().GetItemAt(4)->GetId()); + Assert::AreEqual((int)ra::data::Value::Format::Minutes, editor.Formats().GetItemAt(4)->GetId()); Assert::AreEqual(std::wstring(L"Time (Minutes)"), editor.Formats().GetItemAt(4)->GetLabel()); - Assert::AreEqual((int)ra::data::ValueFormat::SecondsAsMinutes, editor.Formats().GetItemAt(5)->GetId()); + Assert::AreEqual((int)ra::data::Value::Format::SecondsAsMinutes, editor.Formats().GetItemAt(5)->GetId()); Assert::AreEqual(std::wstring(L"Time (Seconds as Minutes)"), editor.Formats().GetItemAt(5)->GetLabel()); - Assert::AreEqual((int)ra::data::ValueFormat::Value, editor.Formats().GetItemAt(6)->GetId()); + Assert::AreEqual((int)ra::data::Value::Format::Value, editor.Formats().GetItemAt(6)->GetId()); Assert::AreEqual(std::wstring(L"Value"), editor.Formats().GetItemAt(6)->GetLabel()); - Assert::AreEqual((int)ra::data::ValueFormat::UnsignedValue, editor.Formats().GetItemAt(7)->GetId()); + Assert::AreEqual((int)ra::data::Value::Format::UnsignedValue, editor.Formats().GetItemAt(7)->GetId()); Assert::AreEqual(std::wstring(L"Value (Unsigned)"), editor.Formats().GetItemAt(7)->GetLabel()); - Assert::AreEqual((int)ra::data::ValueFormat::Tens, editor.Formats().GetItemAt(8)->GetId()); + Assert::AreEqual((int)ra::data::Value::Format::Tens, editor.Formats().GetItemAt(8)->GetId()); Assert::AreEqual(std::wstring(L"Value (Tens)"), editor.Formats().GetItemAt(8)->GetLabel()); - Assert::AreEqual((int)ra::data::ValueFormat::Hundreds, editor.Formats().GetItemAt(9)->GetId()); + Assert::AreEqual((int)ra::data::Value::Format::Hundreds, editor.Formats().GetItemAt(9)->GetId()); Assert::AreEqual(std::wstring(L"Value (Hundreds)"), editor.Formats().GetItemAt(9)->GetLabel()); - Assert::AreEqual((int)ra::data::ValueFormat::Thousands, editor.Formats().GetItemAt(10)->GetId()); + Assert::AreEqual((int)ra::data::Value::Format::Thousands, editor.Formats().GetItemAt(10)->GetId()); Assert::AreEqual(std::wstring(L"Value (Thousands)"), editor.Formats().GetItemAt(10)->GetLabel()); - Assert::AreEqual((int)ra::data::ValueFormat::Fixed1, editor.Formats().GetItemAt(11)->GetId()); + Assert::AreEqual((int)ra::data::Value::Format::Fixed1, editor.Formats().GetItemAt(11)->GetId()); Assert::AreEqual(std::wstring(L"Value (Fixed1)"), editor.Formats().GetItemAt(11)->GetLabel()); - Assert::AreEqual((int)ra::data::ValueFormat::Fixed2, editor.Formats().GetItemAt(12)->GetId()); + Assert::AreEqual((int)ra::data::Value::Format::Fixed2, editor.Formats().GetItemAt(12)->GetId()); Assert::AreEqual(std::wstring(L"Value (Fixed2)"), editor.Formats().GetItemAt(12)->GetLabel()); - Assert::AreEqual((int)ra::data::ValueFormat::Fixed3, editor.Formats().GetItemAt(13)->GetId()); + Assert::AreEqual((int)ra::data::Value::Format::Fixed3, editor.Formats().GetItemAt(13)->GetId()); Assert::AreEqual(std::wstring(L"Value (Fixed3)"), editor.Formats().GetItemAt(13)->GetLabel()); Assert::AreEqual({ 4U }, editor.LeaderboardParts().Count()); @@ -681,7 +682,7 @@ TEST_CLASS(AssetEditorViewModel_Tests) leaderboard.SetCancelTrigger("0xH1234=2"); leaderboard.SetSubmitTrigger("0xH1234=3"); leaderboard.SetValueDefinition("0xH2345"); - leaderboard.SetValueFormat(ra::data::ValueFormat::Centiseconds); + leaderboard.SetValueFormat(ra::data::Value::Format::Centiseconds); leaderboard.SetLowerIsBetter(false); leaderboard.CreateServerCheckpoint(); leaderboard.CreateLocalCheckpoint(); @@ -694,7 +695,7 @@ TEST_CLASS(AssetEditorViewModel_Tests) Assert::AreEqual(std::wstring(L"Do something cool"), editor.GetDescription()); Assert::AreEqual(AssetCategory::Unofficial, editor.GetCategory()); Assert::AreEqual(AssetState::Active, editor.GetState()); - Assert::AreEqual(ra::data::ValueFormat::Centiseconds, editor.GetValueFormat()); + Assert::AreEqual(ra::data::Value::Format::Centiseconds, editor.GetValueFormat()); Assert::IsFalse(editor.IsLowerBetter()); Assert::IsFalse(editor.IsPauseOnReset()); Assert::IsFalse(editor.IsPauseOnTrigger()); @@ -759,7 +760,7 @@ TEST_CLASS(AssetEditorViewModel_Tests) Assert::AreEqual(std::wstring(L""), editor.GetDescription()); Assert::AreEqual(AssetCategory::Local, editor.GetCategory()); Assert::AreEqual(AssetState::Inactive, editor.GetState()); - Assert::AreEqual(ra::data::ValueFormat::Value, editor.GetValueFormat()); + Assert::AreEqual(ra::data::Value::Format::Value, editor.GetValueFormat()); Assert::IsFalse(editor.IsLowerBetter()); Assert::IsFalse(editor.IsPauseOnReset()); Assert::IsFalse(editor.IsPauseOnTrigger()); @@ -1105,21 +1106,21 @@ TEST_CLASS(AssetEditorViewModel_Tests) { AssetEditorViewModelHarness editor; LeaderboardModel leaderboard; - leaderboard.SetValueFormat(ra::data::ValueFormat::Score); + leaderboard.SetValueFormat(ra::data::Value::Format::Score); leaderboard.CreateServerCheckpoint(); leaderboard.CreateLocalCheckpoint(); editor.LoadAsset(&leaderboard); - Assert::AreEqual(ra::data::ValueFormat::Score, editor.GetValueFormat()); - Assert::AreEqual(ra::data::ValueFormat::Score, leaderboard.GetValueFormat()); + Assert::AreEqual(ra::data::Value::Format::Score, editor.GetValueFormat()); + Assert::AreEqual(ra::data::Value::Format::Score, leaderboard.GetValueFormat()); - editor.SetValueFormat(ra::data::ValueFormat::Frames); - Assert::AreEqual(ra::data::ValueFormat::Frames, editor.GetValueFormat()); - Assert::AreEqual(ra::data::ValueFormat::Frames, leaderboard.GetValueFormat()); + editor.SetValueFormat(ra::data::Value::Format::Frames); + Assert::AreEqual(ra::data::Value::Format::Frames, editor.GetValueFormat()); + Assert::AreEqual(ra::data::Value::Format::Frames, leaderboard.GetValueFormat()); - leaderboard.SetValueFormat(ra::data::ValueFormat::Centiseconds); - Assert::AreEqual(ra::data::ValueFormat::Centiseconds, editor.GetValueFormat()); - Assert::AreEqual(ra::data::ValueFormat::Centiseconds, leaderboard.GetValueFormat()); + leaderboard.SetValueFormat(ra::data::Value::Format::Centiseconds); + Assert::AreEqual(ra::data::Value::Format::Centiseconds, editor.GetValueFormat()); + Assert::AreEqual(ra::data::Value::Format::Centiseconds, leaderboard.GetValueFormat()); } TEST_METHOD(TestSyncLowerIsBetter) @@ -2465,7 +2466,7 @@ TEST_CLASS(AssetEditorViewModel_Tests) LeaderboardModel leaderboard; leaderboard.SetDefinition("STA:0x1234=1::CAN:0x1234=2::SUB:0x1234=3::VAL=0x1235"); - leaderboard.SetValueFormat(ra::data::ValueFormat::Score); + leaderboard.SetValueFormat(ra::data::Value::Format::Score); leaderboard.CreateServerCheckpoint(); leaderboard.CreateLocalCheckpoint(); diff --git a/tests/ui/viewmodels/AssetListViewModel_Tests.cpp b/tests/ui/viewmodels/AssetListViewModel_Tests.cpp index 486e3276..3166af3c 100644 --- a/tests/ui/viewmodels/AssetListViewModel_Tests.cpp +++ b/tests/ui/viewmodels/AssetListViewModel_Tests.cpp @@ -22,6 +22,7 @@ #include "tests\devkit\services\mocks\MockLocalStorage.hh" #include "tests\devkit\services\mocks\MockThreadPool.hh" #include "tests\devkit\testutil\AssetAsserts.hh" +#include "tests\devkit\testutil\ValueAsserts.hh" #include "tests\mocks\MockAchievementRuntime.hh" #include "tests\mocks\MockConfiguration.hh" #include "tests\mocks\MockDesktop.hh" @@ -4476,7 +4477,7 @@ TEST_CLASS(AssetListViewModel_Tests) vmLeaderboard->SetSubmitTrigger("0xH1234=1"); vmLeaderboard->SetCancelTrigger("0xH1234=2"); vmLeaderboard->SetValueDefinition("0xH5555*2"); - vmLeaderboard->SetValueFormat(ra::data::ValueFormat::Score); + vmLeaderboard->SetValueFormat(ra::data::Value::Format::Score); vmLeaderboard->SetLowerIsBetter(true); vmLeaderboard->SetAuthor(L"OriginalAuthor"); @@ -4517,7 +4518,7 @@ TEST_CLASS(AssetListViewModel_Tests) Assert::AreEqual(std::string("0xH1234=1"), pLeaderboard->GetSubmitTrigger()); Assert::AreEqual(std::string("0xH1234=2"), pLeaderboard->GetCancelTrigger()); Assert::AreEqual(std::string("0xH5555*2"), pLeaderboard->GetValueDefinition()); - Assert::AreEqual(ra::data::ValueFormat::Score, pLeaderboard->GetValueFormat()); + Assert::AreEqual(ra::data::Value::Format::Score, pLeaderboard->GetValueFormat()); Assert::IsTrue(pLeaderboard->IsLowerBetter()); Assert::AreEqual(std::wstring(L"DisplayName"), pLeaderboard->GetAuthor()); diff --git a/tests/ui/viewmodels/AssetUploadViewModel_Tests.cpp b/tests/ui/viewmodels/AssetUploadViewModel_Tests.cpp index 3a06bb0d..bbf6204c 100644 --- a/tests/ui/viewmodels/AssetUploadViewModel_Tests.cpp +++ b/tests/ui/viewmodels/AssetUploadViewModel_Tests.cpp @@ -7,7 +7,6 @@ #include "data\models\AchievementModel.hh" #include "data\models\LeaderboardModel.hh" -#include "tests\data\DataAsserts.hh" #include "tests\ui\UIAsserts.hh" #include "tests\devkit\context\mocks\MockEmulatorMemoryContext.hh" #include "tests\devkit\context\mocks\MockRcClient.hh" @@ -15,6 +14,7 @@ #include "tests\devkit\services\mocks\MockLocalStorage.hh" #include "tests\devkit\services\mocks\MockThreadPool.hh" #include "tests\devkit\testutil\AssetAsserts.hh" +#include "tests\devkit\testutil\ValueAsserts.hh" #include "tests\mocks\MockAchievementRuntime.hh" #include "tests\mocks\MockDesktop.hh" #include "tests\mocks\MockGameContext.hh" @@ -123,7 +123,7 @@ TEST_CLASS(AssetUploadViewModel_Tests) LeaderboardModel& AddLeaderboard(AssetCategory nCategory, const std::wstring& sTitle, const std::wstring& sDescription, const std::string& sStartTrigger, const std::string& sSubmitTrigger, - const std::string& sCancelTrigger, const std::string& sValueDefinition, ra::data::ValueFormat nFormat) + const std::string& sCancelTrigger, const std::string& sValueDefinition, ra::data::Value::Format nFormat) { auto vmLeaderboard = std::make_unique(); if (nCategory == AssetCategory::Local) @@ -1074,7 +1074,7 @@ TEST_CLASS(AssetUploadViewModel_Tests) TEST_METHOD(TestSingleLocalLeaderboard) { AssetUploadViewModelHarness vmUpload; - auto& pLeaderboard = vmUpload.AddLeaderboard(AssetCategory::Local, L"Title1", L"Desc1", "0xH1234=1", "0xH1234=2", "0xH1234=3", "0xH2345", ra::data::ValueFormat::Score); + auto& pLeaderboard = vmUpload.AddLeaderboard(AssetCategory::Local, L"Title1", L"Desc1", "0xH1234=1", "0xH1234=2", "0xH1234=3", "0xH2345", ra::data::Value::Format::Score); Assert::AreEqual(AssetChanges::Unpublished, pLeaderboard.GetChanges()); vmUpload.QueueAsset(pLeaderboard); @@ -1092,7 +1092,7 @@ TEST_CLASS(AssetUploadViewModel_Tests) Assert::AreEqual(std::string("0xH1234=2"), pRequest.SubmitTrigger); Assert::AreEqual(std::string("0xH1234=3"), pRequest.CancelTrigger); Assert::AreEqual(std::string("0xH2345"), pRequest.ValueDefinition); - Assert::AreEqual(ra::data::ValueFormat::Score, pRequest.Format); + Assert::AreEqual(ra::data::Value::Format::Score, pRequest.Format); Assert::IsFalse(pRequest.LowerIsBetter); Assert::AreEqual(0U, pRequest.LeaderboardId); @@ -1118,7 +1118,7 @@ TEST_CLASS(AssetUploadViewModel_Tests) AssetUploadViewModelHarness vmUpload; vmUpload.mockGameContext.MockSubset(33, 22, "Subset"); auto& pLeaderboard = vmUpload.AddLeaderboard(AssetCategory::Local, L"Title1", L"Desc1", "0xH1234=1", - "0xH1234=2", "0xH1234=3", "0xH2345", ra::data::ValueFormat::Score); + "0xH1234=2", "0xH1234=3", "0xH2345", ra::data::Value::Format::Score); pLeaderboard.SetSubsetID(22U); Assert::AreEqual(AssetChanges::Unpublished, pLeaderboard.GetChanges()); @@ -1137,7 +1137,7 @@ TEST_CLASS(AssetUploadViewModel_Tests) Assert::AreEqual(std::string("0xH1234=2"), pRequest.SubmitTrigger); Assert::AreEqual(std::string("0xH1234=3"), pRequest.CancelTrigger); Assert::AreEqual(std::string("0xH2345"), pRequest.ValueDefinition); - Assert::AreEqual(ra::data::ValueFormat::Score, pRequest.Format); + Assert::AreEqual(ra::data::Value::Format::Score, pRequest.Format); Assert::IsFalse(pRequest.LowerIsBetter); Assert::AreEqual(0U, pRequest.LeaderboardId);