Skip to content

Commit

Permalink
Write state properties
Browse files Browse the repository at this point in the history
Fixes #133
  • Loading branch information
heaths committed Jan 2, 2019
1 parent 9808946 commit 236e409
Show file tree
Hide file tree
Showing 9 changed files with 332 additions and 2 deletions.
8 changes: 8 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"editor.insertSpaces": true,
"editor.tabSize": 4,
"files.associations": {
"functional": "cpp",
"string": "cpp"
}
}
60 changes: 60 additions & 0 deletions src/vswhere.lib/Formatter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ Formatter::Formatter()
{ L"installationVersion", bind(&Formatter::GetInstallationVersion, this, _1, _2) },
{ L"productId", bind(&Formatter::GetProductId, this, _1, _2) },
{ L"productPath", bind(&Formatter::GetProductPath, this, _1, _2) },
{ L"state", bind(&Formatter::GetState, this, _1, _2) },
{ L"isComplete", bind(&Formatter::GetIsComplete, this, _1, _2) },
{ L"isLaunchable", bind(&Formatter::GetIsLaunchable, this, _1, _2) },
{ L"isPrerelease", bind(&Formatter::GetIsPrerelease, this, _1, _2) },
{ L"displayName", bind(&Formatter::GetDisplayName, this, _1, _2) },
{ L"description", bind(&Formatter::GetDescription, this, _1, _2) },
Expand Down Expand Up @@ -453,6 +456,63 @@ HRESULT Formatter::GetProductPath(_In_ ISetupInstance* pInstance, _Out_ VARIANT*
return hr;
}

HRESULT Formatter::GetState(_In_ ISetupInstance* pInstance, _Out_ VARIANT* pvtState)
{
ISetupInstance2Ptr instance;
variant_t vt;

auto hr = pInstance->QueryInterface(&instance);
if (SUCCEEDED(hr))
{
hr = instance->GetState(reinterpret_cast<InstanceState*>(&vt.uintVal));
if (SUCCEEDED(hr))
{
vt.vt = VT_UI4;
*pvtState = vt.Detach();
}
}

return hr;
}

HRESULT Formatter::GetIsComplete(_In_ ISetupInstance* pInstance, _Out_ VARIANT* pvtIsComplete)
{
ISetupInstance2Ptr instance;
variant_t vt;

auto hr = pInstance->QueryInterface(&instance);
if (SUCCEEDED(hr))
{
hr = instance->IsComplete(&vt.boolVal);
if (SUCCEEDED(hr))
{
vt.vt = VT_BOOL;
*pvtIsComplete = vt.Detach();
}
}

return hr;
}

HRESULT Formatter::GetIsLaunchable(_In_ ISetupInstance* pInstance, _Out_ VARIANT* pvtIsLaunchable)
{
ISetupInstance2Ptr instance;
variant_t vt;

auto hr = pInstance->QueryInterface(&instance);
if (SUCCEEDED(hr))
{
hr = instance->IsLaunchable(&vt.boolVal);
if (SUCCEEDED(hr))
{
vt.vt = VT_BOOL;
*pvtIsLaunchable = vt.Detach();
}
}

return hr;
}

HRESULT Formatter::GetIsPrerelease(_In_ ISetupInstance* pInstance, _Out_ VARIANT* pvtIsPrerelease)
{
ISetupInstanceCatalogPtr catalog;
Expand Down
3 changes: 3 additions & 0 deletions src/vswhere.lib/Formatter.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,9 @@ class Formatter
HRESULT GetInstallationVersion(_In_ ISetupInstance* pInstance, _Out_ VARIANT* pvtInstallationVersion);
HRESULT GetProductId(_In_ ISetupInstance* pInstance, _Out_ VARIANT* pvtProductId);
HRESULT GetProductPath(_In_ ISetupInstance* pInstance, _Out_ VARIANT* pvtProductPath);
HRESULT GetState(_In_ ISetupInstance* pInstance, _Out_ VARIANT* pvtState);
HRESULT GetIsComplete(_In_ ISetupInstance* pInstance, _Out_ VARIANT* pvtIsComplete);
HRESULT GetIsLaunchable(_In_ ISetupInstance* pInstance, _Out_ VARIANT* pvtIsLaunchable);
HRESULT GetIsPrerelease(_In_ ISetupInstance* pInstance, _Out_ VARIANT* pvtIsPrerelease);
HRESULT GetDisplayName(_In_ ISetupInstance* pInstance, _Out_ VARIANT* pvtDisplayName);
HRESULT GetDescription(_In_ ISetupInstance* pInstance, _Out_ VARIANT* pvtDescription);
Expand Down
2 changes: 1 addition & 1 deletion src/vswhere.lib/JsonFormatter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ void JsonFormatter::WriteProperty(_In_ Console& console, _In_ const wstring& nam
void JsonFormatter::WriteProperty(_In_ Console& console, _In_ const wstring& name, _In_ long long value)
{
StartProperty(console);
console.Write(L"\n%ls\"%ls\": %d", m_padding.c_str(), name.c_str(), value);
console.Write(L"\n%ls\"%ls\": %I64d", m_padding.c_str(), name.c_str(), value);
}

void JsonFormatter::EndObject(_In_ Console& console)
Expand Down
62 changes: 62 additions & 0 deletions test/vswhere.test/JsonFormatterTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -418,4 +418,66 @@ TEST_CLASS(JsonFormatterTests)

Assert::AreEqual(expected, console);
}

BEGIN_TEST_METHOD_ATTRIBUTE(Writes_State)
TEST_WORKITEM(133)
END_TEST_METHOD_ATTRIBUTE()
TEST_METHOD(Writes_State)
{
CommandArgs args;
TestConsole console(args);
TestInstance instance =
{
{ L"InstanceId", L"a1b2c3" },
{ L"State", L"11" },
{ L"IsComplete", L"true"},
{ L"IsLaunchable", L"false" },
};

JsonFormatter sut;
sut.Write(args, console, &instance);

auto expected =
L"[\n"
L" {\n"
L" \"instanceId\": \"a1b2c3\",\n"
L" \"state\": 11,\n"
L" \"isComplete\": true,\n"
L" \"isLaunchable\": false\n"
L" }\n"
L"]\n";

Assert::AreEqual(expected, console);
}

BEGIN_TEST_METHOD_ATTRIBUTE(Writes_Complete_State)
TEST_WORKITEM(133)
END_TEST_METHOD_ATTRIBUTE()
TEST_METHOD(Writes_Complete_State)
{
CommandArgs args;
TestConsole console(args);
TestInstance instance =
{
{ L"InstanceId", L"a1b2c3" },
{ L"State", L"4294967295" },
{ L"IsComplete", L"true"},
{ L"IsLaunchable", L"true" },
};

JsonFormatter sut;
sut.Write(args, console, &instance);

auto expected =
L"[\n"
L" {\n"
L" \"instanceId\": \"a1b2c3\",\n"
L" \"state\": 4294967295,\n"
L" \"isComplete\": true,\n"
L" \"isLaunchable\": true\n"
L" }\n"
L"]\n";

Assert::AreEqual(expected, console);
}
};
27 changes: 26 additions & 1 deletion test/vswhere.test/TestInstance.h
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ class TestInstance :
_Out_ InstanceState* pState
)
{
return E_NOTIMPL;
return TryGetLONGLONG(L"State", reinterpret_cast<PLONGLONG>(pState));
}

STDMETHODIMP GetPackages(
Expand Down Expand Up @@ -414,6 +414,31 @@ class TestInstance :
return hr;
}

STDMETHODIMP TryGetLONGLONG(_In_ LPCWSTR wszName, _Out_ PLONGLONG pll)
{
if (!pll)
{
return E_POINTER;
}

std::wstring value;

auto hr = TryGet(wszName, value);
if (SUCCEEDED(hr))
{
*pll = _wtoi64(value.c_str());
if (*pll == 0)
{
if (errno == ERANGE || errno == EINVAL)
{
hr = E_INVALIDARG;
}
}
}

return hr;
}

ISetupPackageReferencePtr m_product;
std::vector<ISetupPackageReferencePtr> m_packages;
MapType m_properties;
Expand Down
54 changes: 54 additions & 0 deletions test/vswhere.test/TextFormatterTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -399,4 +399,58 @@ TEST_CLASS(TextFormatterTests)

Assert::AreEqual(expected, console);
}

BEGIN_TEST_METHOD_ATTRIBUTE(Writes_State)
TEST_WORKITEM(133)
END_TEST_METHOD_ATTRIBUTE()
TEST_METHOD(Writes_State)
{
CommandArgs args;
TestConsole console(args);
TestInstance instance =
{
{ L"InstanceId", L"a1b2c3" },
{ L"State", L"11" },
{ L"IsComplete", L"true"},
{ L"IsLaunchable", L"false" },
};

TextFormatter sut;
sut.Write(args, console, &instance);

auto expected =
L"instanceId: a1b2c3\n"
L"state: 11\n"
L"isComplete: 1\n"
L"isLaunchable: 0\n";

Assert::AreEqual(expected, console);
}

BEGIN_TEST_METHOD_ATTRIBUTE(Writes_Complete_State)
TEST_WORKITEM(133)
END_TEST_METHOD_ATTRIBUTE()
TEST_METHOD(Writes_Complete_State)
{
CommandArgs args;
TestConsole console(args);
TestInstance instance =
{
{ L"InstanceId", L"a1b2c3" },
{ L"State", L"4294967295" },
{ L"IsComplete", L"true"},
{ L"IsLaunchable", L"true" },
};

TextFormatter sut;
sut.Write(args, console, &instance);

auto expected =
L"instanceId: a1b2c3\n"
L"state: 4294967295\n"
L"isComplete: 1\n"
L"isLaunchable: 1\n";

Assert::AreEqual(expected, console);
}
};
54 changes: 54 additions & 0 deletions test/vswhere.test/ValueFormatterTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -372,4 +372,58 @@ TEST_CLASS(ValueFormatterTests)

Assert::AreEqual(expected, console);
}

BEGIN_TEST_METHOD_ATTRIBUTE(Writes_State)
TEST_WORKITEM(133)
END_TEST_METHOD_ATTRIBUTE()
TEST_METHOD(Writes_State)
{
CommandArgs args;
TestConsole console(args);
TestInstance instance =
{
{ L"InstanceId", L"a1b2c3" },
{ L"State", L"11" },
{ L"IsComplete", L"true"},
{ L"IsLaunchable", L"false" },
};

ValueFormatter sut;
sut.Write(args, console, &instance);

auto expected =
L"a1b2c3\n"
L"11\n"
L"1\n"
L"0\n";

Assert::AreEqual(expected, console);
}

BEGIN_TEST_METHOD_ATTRIBUTE(Writes_Complete_State)
TEST_WORKITEM(133)
END_TEST_METHOD_ATTRIBUTE()
TEST_METHOD(Writes_Complete_State)
{
CommandArgs args;
TestConsole console(args);
TestInstance instance =
{
{ L"InstanceId", L"a1b2c3" },
{ L"State", L"4294967295" },
{ L"IsComplete", L"true"},
{ L"IsLaunchable", L"true" },
};

ValueFormatter sut;
sut.Write(args, console, &instance);

auto expected =
L"a1b2c3\n"
L"4294967295\n"
L"1\n"
L"1\n";

Assert::AreEqual(expected, console);
}
};
64 changes: 64 additions & 0 deletions test/vswhere.test/XmlFormatterTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -429,4 +429,68 @@ TEST_CLASS(XmlFormatterTests)

Assert::AreEqual(expected, console);
}

BEGIN_TEST_METHOD_ATTRIBUTE(Writes_State)
TEST_WORKITEM(133)
END_TEST_METHOD_ATTRIBUTE()
TEST_METHOD(Writes_State)
{
CommandArgs args;
TestConsole console(args);
TestInstance instance =
{
{ L"InstanceId", L"a1b2c3" },
{ L"State", L"11" },
{ L"IsComplete", L"true"},
{ L"IsLaunchable", L"false" },
};

XmlFormatter sut;
sut.Write(args, console, &instance);

auto expected =
L"<?xml version=\"1.0\"?>\n"
L"<instances>\n"
L" <instance>\n"
L" <instanceId>a1b2c3</instanceId>\n"
L" <state>11</state>\n"
L" <isComplete>1</isComplete>\n"
L" <isLaunchable>0</isLaunchable>\n"
L" </instance>\n"
L"</instances>\n";

Assert::AreEqual(expected, console);
}

BEGIN_TEST_METHOD_ATTRIBUTE(Writes_Complete_State)
TEST_WORKITEM(133)
END_TEST_METHOD_ATTRIBUTE()
TEST_METHOD(Writes_Complete_State)
{
CommandArgs args;
TestConsole console(args);
TestInstance instance =
{
{ L"InstanceId", L"a1b2c3" },
{ L"State", L"4294967295" },
{ L"IsComplete", L"true"},
{ L"IsLaunchable", L"true" },
};

XmlFormatter sut;
sut.Write(args, console, &instance);

auto expected =
L"<?xml version=\"1.0\"?>\n"
L"<instances>\n"
L" <instance>\n"
L" <instanceId>a1b2c3</instanceId>\n"
L" <state>4294967295</state>\n"
L" <isComplete>1</isComplete>\n"
L" <isLaunchable>1</isLaunchable>\n"
L" </instance>\n"
L"</instances>\n";

Assert::AreEqual(expected, console);
}
};

0 comments on commit 236e409

Please # to comment.