PowerToys/doc/devdocs/modules/launcher/plugins/calculator.md
José Javier Rodríguez Zas (JJ) cc708e7ac5
Calculator - Human multiplication expressions (#24655)
* fixes #20187

* handles PR reviews
- fix some typos
- updated dev docs
- added PR examples to tests
- improve method naming style

* Fix typo

Co-authored-by: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>

---------

Co-authored-by: José Javier Rodríguez Zas <jj.jobs2live@outlook.com>
Co-authored-by: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
2023-03-10 21:48:04 +01:00

4.9 KiB

Calculator Plugin

The Calculator plugin as the name suggests is used to perform calculations on the user entered query.

Image of Calculator plugin

Optional plugin settings

  • We have the following settings that the user can configure to change the behavior of the plugin:

    Key Default value Name Description
    InputUseEnglishFormat` | false` | se English (United States) number format for input | gnores your system setting and expects numbers in the format '1,000.50' |
    OutputUseEnglishFormat` | false` | se English (United States) number format for output | gnores your system setting and returns numbers in the format '1000.50' |
  • The optional plugin settings are implemented via the ISettingProvider interface from Wox.Plugin project. All available settings for the plugin are defined in the Main class of the plugin.

Technical details

BracketHelper

  • This helper validates the bracket usage in the input string.

CalculateHelper

  • The CalculateHelper.cs class checks to see if the user entered query is a valid input to the calculator and only if the input is valid does it perform the operation.
    • It does so by matching the user query to a valid regex.
  • This class also handles some human multiplication expression like 2(1+2) and (2+3)(3+4) in order to be computed by Mages lib.
    • It does so by matching some regex and inserting '*' where appropriate, e.g: 2(1+2) -> 2 * (1+2)
    • It takes into account the combination of numbers (num), constants (const), functions (func) and expressions in parentheses ((exp)).
    • The blank spaces between them are also considered.
    • Some combinations were not handled as they are not common such as 'const num' or 'func const'

CalculateEngine

var result = CalculateEngine.Interpret(query.Search, CultureInfo.CurrentUICulture);

CalculateResult

  • The class which encapsulates the result of the computation.
  • It comprises of the Result and RoundedResult properties.

ErrorHandler

  • The class which encapsulates the code to log errors and format the user message.
  • It returns an error result if the user searches with the activation command. This error result is shown to the user.

Score

The score of each result from the calculator plugin is 300.

Unit Tests

We have a Unit Test project that executes various test to ensure that the plugin works as expected.

BracketHelperTests

ExtendedCalculatorParserTests

NumberTranslatorTests

  • The NumberTranslatorTests.cs class contains tests to validate that each number is converted correctly based on the defined locals.

QueryTests

  • The QueryTests.cs class contains tests to validate that the user gets the correct results when searching.