mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-10 10:55:33 +00:00
Add test cases and complete code paths for keyboard language info in COM API
This commit is contained in:
parent
53c163c326
commit
ac2b6ed87e
16 changed files with 580 additions and 144 deletions
|
|
@ -86,19 +86,17 @@ begin
|
|||
end;
|
||||
|
||||
procedure TKeymanKeyboardLanguagesInstalled.DoRefresh;
|
||||
var
|
||||
FProfiles: TStringList;
|
||||
i: Integer;
|
||||
FKeyboardLanguage: TKeymanKeyboardLanguageInstalled;
|
||||
RootPath: string;
|
||||
FLangID: Integer;
|
||||
FName, FLocale: string;
|
||||
FGUID: TGUID;
|
||||
begin
|
||||
KL.MethodEnter(Self, 'DoRefresh', []);
|
||||
try
|
||||
{ Iterate through something somewhere and get the languages associated with this profile? }
|
||||
|
||||
procedure RefreshProfiles;
|
||||
var
|
||||
FProfiles: TStringList;
|
||||
i: Integer;
|
||||
FKeyboardLanguage: TKeymanKeyboardLanguageInstalled;
|
||||
RootPath: string;
|
||||
FLangID: Integer;
|
||||
FName, FLocale: string;
|
||||
FGUID: TGUID;
|
||||
begin
|
||||
FProfiles := TStringList.Create;
|
||||
with TRegistryErrorControlled.Create do
|
||||
try
|
||||
|
|
@ -129,6 +127,55 @@ begin
|
|||
Free;
|
||||
FProfiles.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
function HasLanguage(BCP47: string): Boolean;
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
for i := 0 to FLanguages.Count - 1 do
|
||||
if SameText((FLanguages[i] as IKeymanKeyboardLanguage).BCP47Code, BCP47) then
|
||||
Exit(True);
|
||||
Result := False;
|
||||
end;
|
||||
|
||||
procedure RefreshSuggestedLanguages;
|
||||
var
|
||||
RootPath: string;
|
||||
FIDs: TStringList;
|
||||
i: Integer;
|
||||
FName: string;
|
||||
FKeyboardLanguage: TKeymanKeyboardLanguageInstalled;
|
||||
begin
|
||||
FIDs := TStringList.Create;
|
||||
with TRegistryErrorControlled.Create do
|
||||
try
|
||||
RootKey := HKEY_LOCAL_MACHINE;
|
||||
RootPath := GetRegistryKeyboardInstallKey_LM(FOwner.ID) + '\' + SRegSubKey_SuggestedLanguages;
|
||||
if OpenKeyReadOnly(RootPath) then
|
||||
begin
|
||||
GetValueNames(FIDs);
|
||||
for i := 0 to FIDs.Count - 1 do
|
||||
begin
|
||||
if not HasLanguage(FIDs[i]) then
|
||||
begin
|
||||
FName := ReadString(FIDs[i]);
|
||||
FKeyboardLanguage := TKeymanKeyboardLanguageInstalled.Create(Context, FOwner, FIDs[i], 0, GUID_NULL, FName);
|
||||
FLanguages.Add(FKeyboardLanguage);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
finally
|
||||
Free;
|
||||
FIDs.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
begin
|
||||
KL.MethodEnter(Self, 'DoRefresh', []);
|
||||
try
|
||||
RefreshProfiles;
|
||||
RefreshSuggestedLanguages;
|
||||
finally
|
||||
KL.MethodExit(Self, 'DoRefresh');
|
||||
end;
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ type
|
|||
function Get_DefaultWindowsLanguages: WideString; override; safecall;
|
||||
function Get_DefaultPrimaryLanguage: Integer; override; safecall;
|
||||
function Get_Version: WideString; override; safecall;
|
||||
function Get_Languages: IKeymanKeyboardLanguages; safecall;
|
||||
function Get_Languages: IKeymanKeyboardLanguagesFile; safecall;
|
||||
public
|
||||
constructor Create(AContext: TKeymanContext; const Filename: Widestring; pk: TPackageKeyboard);
|
||||
destructor Destroy; override;
|
||||
|
|
@ -173,7 +173,7 @@ begin
|
|||
Result := FKeyboardInfo.KeyboardVersion;
|
||||
end;
|
||||
|
||||
function TKeymanKeyboardFile.Get_Languages: IKeymanKeyboardLanguages;
|
||||
function TKeymanKeyboardFile.Get_Languages: IKeymanKeyboardLanguagesFile;
|
||||
begin
|
||||
Result := FLanguages;
|
||||
end;
|
||||
|
|
|
|||
8
windows/src/engine/kmcomapi/keymanapi_TLB.pas
generated
8
windows/src/engine/kmcomapi/keymanapi_TLB.pas
generated
|
|
@ -12,7 +12,7 @@ unit keymanapi_TLB;
|
|||
// ************************************************************************ //
|
||||
|
||||
// $Rev: 52393 $
|
||||
// File generated on 21/02/2018 1:52:03 PM from Type Library described below.
|
||||
// File generated on 21/02/2018 8:54:26 PM from Type Library described below.
|
||||
|
||||
// ************************************************************************ //
|
||||
// Type Lib: C:\Projects\keyman\open\windows\src\engine\kmcomapi\kmcomapi (1)
|
||||
|
|
@ -889,8 +889,8 @@ type
|
|||
IKeymanKeyboardFile = interface(IKeymanKeyboard)
|
||||
['{80959B80-C7A9-4EB1-AB46-3762F8E5315B}']
|
||||
procedure Install(Force: WordBool); safecall;
|
||||
function Get_Languages: IKeymanKeyboardLanguages; safecall;
|
||||
property Languages: IKeymanKeyboardLanguages read Get_Languages;
|
||||
function Get_Languages: IKeymanKeyboardLanguagesFile; safecall;
|
||||
property Languages: IKeymanKeyboardLanguagesFile read Get_Languages;
|
||||
end;
|
||||
|
||||
// *********************************************************************//
|
||||
|
|
@ -901,7 +901,7 @@ type
|
|||
IKeymanKeyboardFileDisp = dispinterface
|
||||
['{80959B80-C7A9-4EB1-AB46-3762F8E5315B}']
|
||||
procedure Install(Force: WordBool); dispid 256;
|
||||
property Languages: IKeymanKeyboardLanguages readonly dispid 402;
|
||||
property Languages: IKeymanKeyboardLanguagesFile readonly dispid 402;
|
||||
property Bitmap: IPicture readonly dispid 1;
|
||||
property Copyright: WideString readonly dispid 2;
|
||||
property DefaultBCP47Languages: WideString readonly dispid 3;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
// However, when applying changes via the Editor this file will be regenerated
|
||||
// and comments or formatting changes will be lost.
|
||||
// ************************************************************************ //
|
||||
// File generated on 21/02/2018 1:52:06 PM (- $Rev: 12980 $, 701365859).
|
||||
// File generated on 21/02/2018 8:54:28 PM (- $Rev: 12980 $, 726708000).
|
||||
|
||||
[
|
||||
uuid(F16E2A9A-DA46-4EA3-BFF3-BA46B480C961),
|
||||
|
|
@ -581,7 +581,7 @@ library keymanapi
|
|||
[id(0x00000100)]
|
||||
HRESULT _stdcall Install([in] VARIANT_BOOL Force);
|
||||
[propget, id(0x00000192)]
|
||||
HRESULT _stdcall Languages([out, retval] IKeymanKeyboardLanguages** Value);
|
||||
HRESULT _stdcall Languages([out, retval] IKeymanKeyboardLanguagesFile** Value);
|
||||
};
|
||||
|
||||
[
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ unit kpinstallkeyboard; // I3306
|
|||
interface
|
||||
|
||||
uses
|
||||
Windows,
|
||||
Winapi.Windows,
|
||||
PackageInfo,
|
||||
kpbase;
|
||||
|
||||
|
|
@ -66,19 +66,38 @@ type
|
|||
implementation
|
||||
|
||||
uses
|
||||
SysUtils, Classes, Graphics,
|
||||
ErrorControlledRegistry, kmxfile, keymanerror, utilkeyman, utilsystem,
|
||||
isadmin, RegistryKeys, GetOsVersion, glossary,
|
||||
System.SysUtils,
|
||||
System.Classes,
|
||||
System.Variants,
|
||||
Vcl.Graphics,
|
||||
|
||||
Keyman.System.LanguageCodeUtils,
|
||||
|
||||
ErrorControlledRegistry,
|
||||
kmxfile,
|
||||
keymanerror,
|
||||
utilkeyman,
|
||||
utilsystem,
|
||||
isadmin,
|
||||
RegistryKeys,
|
||||
GetOsVersion,
|
||||
glossary,
|
||||
utilexecute,
|
||||
keymanerrorcodes, keymancontext, kpinstallkeyboardlanguageprofiles,
|
||||
OnlineConstants, KLog, custinterfaces, utilolepicture,
|
||||
kprecompilemnemonickeyboard, KPInstallVisualKeyboard,
|
||||
keymanerrorcodes,
|
||||
keymancontext,
|
||||
kpinstallkeyboardlanguageprofiles,
|
||||
OnlineConstants,
|
||||
KLog,
|
||||
custinterfaces,
|
||||
utilolepicture,
|
||||
kprecompilemnemonickeyboard,
|
||||
KPInstallVisualKeyboard,
|
||||
utildir,
|
||||
KeymanPaths,
|
||||
kmxfileconsts,
|
||||
utilicon,
|
||||
utilstr,
|
||||
keymanapi_TLB, Variants;
|
||||
keymanapi_TLB;
|
||||
|
||||
procedure TKPInstallKeyboard.Execute(const FileName, PackageName: string; FInstallOptions: TKPInstallKeyboardOptions; Languages: TPackageKeyboardLanguageList; Force: Boolean);
|
||||
var
|
||||
|
|
@ -98,6 +117,37 @@ var
|
|||
FKVKName: WideString;
|
||||
FCreatedIcon: Boolean;
|
||||
FLanguageID: Integer;
|
||||
|
||||
type
|
||||
TWSLCallback = reference to procedure(r: TRegistryErrorControlled);
|
||||
procedure WriteSuggestedLanguages(c: TWSLCallback);
|
||||
var
|
||||
r: TRegistryErrorControlled;
|
||||
begin
|
||||
r := TRegistryErrorControlled.Create;
|
||||
try
|
||||
r.RootKey := HKEY_LOCAL_MACHINE;
|
||||
if not r.OpenKey('\'+GetRegistryKeyboardInstallKey_LM(FileName)+'\'+SRegSubKey_SuggestedLanguages, True) then
|
||||
r.RaiseLastRegistryError;
|
||||
c(r);
|
||||
finally
|
||||
r.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure AddLanguage(FLanguageID: Integer);
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
for i := 0 to High(FLanguages) do
|
||||
if FLanguages[i] = FLanguageID then
|
||||
Exit;
|
||||
|
||||
SetLength(FLanguages, Length(FLanguages)+1);
|
||||
FLanguages[High(FLanguages)] := FLanguageID;
|
||||
end;
|
||||
|
||||
|
||||
begin
|
||||
KL.MethodEnter(Self, 'Execute', [FileName,PackageName,ikPartOfPackage in FInstallOptions ,Force]);
|
||||
try
|
||||
|
|
@ -195,7 +245,15 @@ begin
|
|||
RegisterLanguageProfile(Languages[0].ID, kbdname, ki.KeyboardName, FIconFileName, Languages[0].Name);
|
||||
|
||||
// Save the list of preferred languages for the keyboard, to the registry, for future installation.
|
||||
////// TODO:BCP47: AddPreferredLanguagesToRegistry(
|
||||
WriteSuggestedLanguages(
|
||||
procedure(r: TRegistryErrorControlled)
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
for i := 0 to Languages.Count - 1 do
|
||||
r.WriteString(Languages[i].ID, Languages[i].Name);
|
||||
end
|
||||
);
|
||||
end
|
||||
else
|
||||
begin
|
||||
|
|
@ -204,8 +262,7 @@ begin
|
|||
//
|
||||
if ki.KeyboardID <> 0 then
|
||||
begin
|
||||
SetLength(FLanguages, 1);
|
||||
FLanguages[0] := ki.KeyboardID;
|
||||
AddLanguage(ki.KeyboardID);
|
||||
end;
|
||||
|
||||
//
|
||||
|
|
@ -220,23 +277,30 @@ begin
|
|||
Delete(FLanguage, 1, 1); // 'x'
|
||||
if TryStrToInt('$'+FLanguage, FLanguageID) then
|
||||
begin
|
||||
SetLength(FLanguages, Length(FLanguages)+1);
|
||||
FLanguages[High(FLanguages)] := FLanguageID;
|
||||
AddLanguage(FLanguageID);
|
||||
end;
|
||||
end;
|
||||
|
||||
//
|
||||
// Final fallback is to install against default language for system // I4607
|
||||
//
|
||||
SetLength(FLanguages, Length(FLanguages)+1);
|
||||
FLanguages[High(FLanguages)] := HKLToLanguageID(FDefaultHKL);
|
||||
if Length(FLanguages) = 0 then
|
||||
AddLanguage(HKLToLanguageID(FDefaultHKL));
|
||||
|
||||
// Registers only the first language
|
||||
RegisterLanguageProfile(FLanguages, kbdname, ki.KeyboardName, FIconFileName); // I3581 // I3707
|
||||
|
||||
// Save the list of preferred languages for the keyboard, translated to BCP47 tags
|
||||
// to the registry, for future installation.
|
||||
////// TODO:BCP47: AddPreferredLanguagesToRegistry(
|
||||
WriteSuggestedLanguages(
|
||||
procedure(r: TRegistryErrorControlled)
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
for i := 0 to High(FLanguages) do
|
||||
r.WriteString(TLanguageCodeUtils.TranslateWindowsLanguagesToBCP47(FLanguages[i]), '');
|
||||
end
|
||||
);
|
||||
end;
|
||||
|
||||
CloseKey;
|
||||
|
|
|
|||
|
|
@ -215,6 +215,8 @@ const
|
|||
|
||||
SRegValue_KeymanProfileGUID = 'profile guid'; // LM CU // I3581
|
||||
|
||||
SRegSubKey_SuggestedLanguages = 'Suggested Languages'; // LM
|
||||
|
||||
{ Language Profiles }
|
||||
|
||||
{$MESSAGE HINT 'Refactor this to use SRegKeyNode naming (no prefix \); fixup references'}
|
||||
|
|
|
|||
|
|
@ -8,20 +8,10 @@ uses
|
|||
Winapi.ActiveX,
|
||||
System.Win.ComObj,
|
||||
System.SysUtils,
|
||||
keymanapi_tlb;
|
||||
keymanapi_tlb,
|
||||
Keyman.Test.Console.KeymanAPITest_Base;
|
||||
|
||||
type
|
||||
TKeymanAPITest_Base = class
|
||||
private
|
||||
FTestPath: string;
|
||||
k: IKeyman;
|
||||
procedure CheckKeyboardProperties(kbd: IKeymanKeyboard);
|
||||
procedure CheckPackageProperties(pkg: IKeymanPackage);
|
||||
public
|
||||
constructor Create;
|
||||
destructor Destroy; override;
|
||||
end;
|
||||
|
||||
[TestFixture]
|
||||
[Category('Default')]
|
||||
TKeymanAPITest = class(TKeymanAPITest_Base)
|
||||
|
|
@ -154,77 +144,6 @@ uses
|
|||
KeymanOptionNames,
|
||||
System.Variants;
|
||||
|
||||
constructor TKeymanAPITest_Base.Create;
|
||||
begin
|
||||
inherited Create;
|
||||
FTestPath := ExtractFilePath(ExtractFileDir(ExtractFileDir(ParamStr(0)))) + 'test\';
|
||||
CoInitializeEx(nil, COINIT_APARTMENTTHREADED);
|
||||
end;
|
||||
|
||||
destructor TKeymanAPITest_Base.Destroy;
|
||||
begin
|
||||
CoUninitialize;
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
procedure TKeymanAPITest_Base.CheckKeyboardProperties(kbd: IKeymanKeyboard);
|
||||
begin
|
||||
Assert.AreEqual('กขฃ', kbd.GetCharsUsed);
|
||||
Assert.AreEqual('(C) 2017 SIL International', kbd.Copyright);
|
||||
Assert.AreEqual('eng', kbd.DefaultBCP47Languages);
|
||||
Assert.AreEqual($040C, kbd.DefaultPrimaryLanguage);
|
||||
Assert.AreEqual('x040C x040C', kbd.DefaultWindowsLanguages);
|
||||
// Assert.IsNotNull(f.DefaultHotkey); TODO: Resolve DefaultHotkey implementation -- remove from reg, read from kmx in --installed, read from kmx in --file as well
|
||||
// Assert.AreEqual(False, f.DefaultHotkey.IsEmpty);
|
||||
// Assert.AreEqual(HK_ALT or HK_CTRL, f.DefaultHotkey.Modifiers);
|
||||
// Assert.AreEqual(Ord('T'), f.DefaultHotkey.VirtualKey);
|
||||
// Assert.AreEqual(0, f.DefaultHotkey.RawValue);
|
||||
// Assert.AreEqual(0, f.DefaultHotkey.Target);
|
||||
Assert.AreEqual(keUnicode, kbd.Encodings);
|
||||
Assert.AreEqual('test.kmx', ExtractFileName(kbd.Filename));
|
||||
Assert.AreEqual('test', kbd.ID);
|
||||
Assert.AreEqual(kltPositional, kbd.LayoutType);
|
||||
Assert.AreEqual('Test Message', kbd.Message);
|
||||
Assert.AreEqual('Test Keyboard', kbd.Name);
|
||||
Assert.AreEqual('1.2.3', kbd.Version);
|
||||
Assert.IsNotNull(kbd.Bitmap);
|
||||
// Assert.AreEqual(f.SerializeXML(...), False);
|
||||
end;
|
||||
|
||||
procedure TKeymanAPITest_Base.CheckPackageProperties(pkg: IKeymanPackage);
|
||||
begin
|
||||
Assert.AreEqual('Keyman', pkg.Author);
|
||||
Assert.AreEqual('mailto:support@keyman.com', pkg.AuthorEmail);
|
||||
Assert.AreEqual('(C) 2017 SIL International', pkg.Copyright);
|
||||
|
||||
Assert.IsNotNull(pkg.Files);
|
||||
// TODO: Check each file
|
||||
|
||||
Assert.IsNotNull(pkg.Fonts);
|
||||
// TODO: Check each font
|
||||
|
||||
Assert.IsNull(pkg.Graphic);
|
||||
Assert.IsNull(pkg.GraphicFile);
|
||||
Assert.AreEqual('test', pkg.ID);
|
||||
Assert.IsNull(pkg.KeyboardOptionsFile);
|
||||
|
||||
Assert.IsNotNull(pkg.Keyboards);
|
||||
Assert.AreEqual(1, pkg.Keyboards.Count);
|
||||
|
||||
Assert.AreEqual('Test Keyboard', pkg.Name);
|
||||
|
||||
Assert.IsNotNull(pkg.ReadmeFile);
|
||||
Assert.AreEqual('readme.txt', ExtractFileName(pkg.ReadmeFile.Filename));
|
||||
|
||||
Assert.IsNull(pkg.UsageFile);
|
||||
Assert.AreEqual('1.2.3', pkg.Version);
|
||||
|
||||
Assert.IsNotNull(pkg.WelcomeFile);
|
||||
Assert.AreEqual('welcome.htm', ExtractFileName(pkg.WelcomeFile.Filename));
|
||||
|
||||
Assert.AreEqual('https://keyman.com/', pkg.Website);
|
||||
end;
|
||||
|
||||
//
|
||||
// IKeyman
|
||||
//
|
||||
|
|
@ -414,7 +333,7 @@ procedure TKeymanAPITest.Test_IKeymanKeyboardFile;
|
|||
var
|
||||
kbd: IKeymanKeyboardFile;
|
||||
begin
|
||||
kbd := k.Keyboards.GetKeyboardFromFile(FTestPath + 'test.kmx');
|
||||
kbd := k.Keyboards.GetKeyboardFromFile(TestPath + 'test.kmx');
|
||||
CheckKeyboardProperties(kbd);
|
||||
// kbd.Install()... Todo: test installation (forced installation is tested in IKeymanKeyboardInstalled)
|
||||
end;
|
||||
|
|
@ -574,7 +493,7 @@ procedure TKeymanAPITest.Test_IKeymanPackageFile;
|
|||
var
|
||||
pkg: IKeymanPackageFile;
|
||||
begin
|
||||
pkg := k.Packages.GetPackageFromFile(FTestPath + 'test.kmp');
|
||||
pkg := k.Packages.GetPackageFromFile(TestPath + 'test.kmp');
|
||||
Assert.IsNotNull(pkg);
|
||||
Assert.AreEqual('test.kmp', ExtractFileName(pkg.Filename));
|
||||
CheckPackageProperties(pkg);
|
||||
|
|
@ -640,7 +559,7 @@ procedure TKeymanAPITest_Elevated.Test_IKeymanKeyboardInstalled;
|
|||
var
|
||||
kbd: IKeymanKeyboardInstalled;
|
||||
begin
|
||||
k.Keyboards.Install(FTestPath + 'test.kmx', True);
|
||||
k.Keyboards.Install(TestPath + 'test.kmx', True);
|
||||
k.Keyboards.Refresh;
|
||||
kbd := k.Keyboards['test'];
|
||||
Assert.IsNotNull(kbd);
|
||||
|
|
@ -668,7 +587,7 @@ var
|
|||
pkg: IKeymanPackageInstalled;
|
||||
kbd: IKeymanKeyboardInstalled;
|
||||
begin
|
||||
k.Packages.Install(FTestPath + 'test.kmp', True);
|
||||
k.Packages.Install(TestPath + 'test.kmp', True);
|
||||
k.Packages.Refresh;
|
||||
k.Keyboards.Refresh;
|
||||
pkg := k.Packages['test'];
|
||||
|
|
|
|||
|
|
@ -0,0 +1,143 @@
|
|||
unit Keyman.Test.Console.KeymanAPITest_BCP47;
|
||||
|
||||
interface
|
||||
uses
|
||||
DUnitX.TestFramework,
|
||||
Keyman.Test.Console.KeymanAPITest_Base,
|
||||
keymanapi_tlb;
|
||||
|
||||
type
|
||||
|
||||
[TestFixture]
|
||||
TKeymanAPITest_BCP47 = class(TKeymanAPITest_Base)
|
||||
private
|
||||
k: IKeyman;
|
||||
public
|
||||
constructor Create;
|
||||
|
||||
[Setup]
|
||||
procedure Setup;
|
||||
[TearDown]
|
||||
procedure TearDown;
|
||||
|
||||
[Test]
|
||||
procedure TestFile;
|
||||
|
||||
[Test]
|
||||
procedure TestInstall;
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
Winapi.Windows,
|
||||
System.SysUtils,
|
||||
System.Win.Registry,
|
||||
RegistryKeys;
|
||||
|
||||
constructor TKeymanAPITest_BCP47.Create;
|
||||
begin
|
||||
// This shouldn't be needed but it seems the parent constructor doesn't run when
|
||||
// instantiated by DUnitX unless constructor is present in child class?
|
||||
inherited Create;
|
||||
end;
|
||||
|
||||
procedure TKeymanAPITest_BCP47.Setup;
|
||||
begin
|
||||
k := CoKeyman.Create;
|
||||
if not k.SystemInfo.IsAdministrator then
|
||||
begin
|
||||
Assert.Fail('Must be running as administrator in order to run elevated tests, to exclude use parameter --exclude:Elevated');
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TKeymanAPITest_BCP47.TearDown;
|
||||
begin
|
||||
k := nil;
|
||||
end;
|
||||
|
||||
// Extracted from utilkeyman.pas.
|
||||
function GetShortKeyboardName(const FileName: string): string;
|
||||
begin
|
||||
if (LowerCase(ExtractFileExt(FileName)) = '.kmx') or
|
||||
(LowerCase(ExtractFileExt(FileName)) = '.kxx') or
|
||||
(LowerCase(ExtractFileExt(FileName)) = '.kmp')
|
||||
then Result := ChangeFileExt(ExtractFileName(FileName), '')
|
||||
else Result := FileName;
|
||||
end;
|
||||
|
||||
// Extracted from utilkeyman.pas.
|
||||
function GetRegistryKeyboardInstallKey_LM(const FileName: string): string;
|
||||
begin
|
||||
Result := SRegKey_InstalledKeyboards_LM+'\'+GetShortKeyboardName(FileName);
|
||||
end;
|
||||
|
||||
procedure TKeymanAPITest_BCP47.TestFile;
|
||||
var
|
||||
kbd_file: IKeymanKeyboardFile;
|
||||
pkg_file: IKeymanPackageFile;
|
||||
begin
|
||||
pkg_file := k.Packages.GetPackageFromFile(TestPath + 'bcp47.kmp');
|
||||
Assert.AreEqual(1, pkg_file.Keyboards.Count);
|
||||
kbd_file := pkg_file.Keyboards[0] as IKeymanKeyboardFile;
|
||||
Assert.AreEqual(2, kbd_file.Languages.Count);
|
||||
Assert.AreEqual('tpi', kbd_file.Languages[0].BCP47Code);
|
||||
Assert.AreEqual('Tok Pisin', kbd_file.Languages[0].Name);
|
||||
pkg_file := nil;
|
||||
kbd_file := nil;
|
||||
end;
|
||||
|
||||
procedure TKeymanAPITest_BCP47.TestInstall;
|
||||
var
|
||||
kbd_installed: IKeymanKeyboardInstalled;
|
||||
pkg_installed: IKeymanPackageInstalled;
|
||||
begin
|
||||
k.Packages.Install(TestPath + 'bcp47.kmp', True);
|
||||
k.Packages.Refresh;
|
||||
k.Keyboards.Refresh;
|
||||
|
||||
pkg_installed := k.Packages['bcp47'];
|
||||
Assert.IsNotNull(pkg_installed);
|
||||
|
||||
kbd_installed := k.Keyboards['bcp47'];
|
||||
Assert.IsNotNull(kbd_installed);
|
||||
|
||||
Assert.AreEqual(2, kbd_installed.Languages.Count, 'kbd.Languages.Count');
|
||||
Assert.AreEqual('tpi', kbd_installed.Languages[0].BCP47Code);
|
||||
Assert.AreEqual('Tok Pisin', kbd_installed.Languages[0].Name);
|
||||
Assert.AreNotEqual(0, kbd_installed.Languages[0].LangID);
|
||||
|
||||
Assert.AreEqual('abg', kbd_installed.Languages[1].BCP47Code);
|
||||
Assert.AreEqual('Abaga', kbd_installed.Languages[1].Name);
|
||||
Assert.AreEqual(0, kbd_installed.Languages[1].LangID);
|
||||
|
||||
Assert.IsTrue(kbd_installed.Languages[0].IsInstalled);
|
||||
Assert.IsFalse(kbd_installed.Languages[1].IsInstalled);
|
||||
|
||||
kbd_installed := nil;
|
||||
|
||||
// Test registry values
|
||||
with TRegistry.Create do
|
||||
try
|
||||
RootKey := HKEY_LOCAL_MACHINE;
|
||||
if OpenKeyReadOnly('\'+GetRegistryKeyboardInstallKey_LM('bcp47')+'\'+SRegSubKey_SuggestedLanguages) then
|
||||
begin
|
||||
Assert.IsTrue(ValueExists('tpi'));
|
||||
Assert.AreEqual(ReadString('tpi'), 'Tok Pisin');
|
||||
|
||||
Assert.IsTrue(ValueExists('abg'));
|
||||
Assert.AreEqual(ReadString('abg'), 'Abaga');
|
||||
end;
|
||||
finally
|
||||
Free;
|
||||
end;
|
||||
|
||||
|
||||
pkg_installed.Uninstall(True);
|
||||
k.Keyboards.Refresh;
|
||||
k.Keyboards.Apply;
|
||||
end;
|
||||
|
||||
initialization
|
||||
TDUnitX.RegisterTestFixture(TKeymanAPITest_BCP47);
|
||||
end.
|
||||
|
|
@ -0,0 +1,103 @@
|
|||
unit Keyman.Test.Console.KeymanAPITest_Base;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
DUnitX.TestFramework,
|
||||
keymanapi_tlb;
|
||||
|
||||
type
|
||||
TKeymanAPITest_Base = class
|
||||
strict private
|
||||
FTestPath: string;
|
||||
FK: IKeyman;
|
||||
protected
|
||||
procedure CheckKeyboardProperties(kbd: IKeymanKeyboard);
|
||||
procedure CheckPackageProperties(pkg: IKeymanPackage);
|
||||
property TestPath: string read FTestPath;
|
||||
property k: IKeyman read FK write FK;
|
||||
public
|
||||
constructor Create;
|
||||
destructor Destroy; override;
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
Winapi.Windows,
|
||||
Winapi.ActiveX,
|
||||
System.Win.ComObj,
|
||||
System.SysUtils;
|
||||
|
||||
constructor TKeymanAPITest_Base.Create;
|
||||
begin
|
||||
inherited Create;
|
||||
FTestPath := ExtractFilePath(ExtractFileDir(ExtractFileDir(ParamStr(0)))) + 'test\';
|
||||
CoInitializeEx(nil, COINIT_APARTMENTTHREADED);
|
||||
end;
|
||||
|
||||
destructor TKeymanAPITest_Base.Destroy;
|
||||
begin
|
||||
CoUninitialize;
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
procedure TKeymanAPITest_Base.CheckKeyboardProperties(kbd: IKeymanKeyboard);
|
||||
begin
|
||||
Assert.AreEqual('กขฃ', kbd.GetCharsUsed);
|
||||
Assert.AreEqual('(C) 2017 SIL International', kbd.Copyright);
|
||||
Assert.AreEqual('en', kbd.DefaultBCP47Languages);
|
||||
Assert.AreEqual($040C, kbd.DefaultPrimaryLanguage);
|
||||
Assert.AreEqual('x040C x040C', kbd.DefaultWindowsLanguages);
|
||||
// Assert.IsNotNull(f.DefaultHotkey); TODO: Resolve DefaultHotkey implementation -- remove from reg, read from kmx in --installed, read from kmx in --file as well
|
||||
// Assert.AreEqual(False, f.DefaultHotkey.IsEmpty);
|
||||
// Assert.AreEqual(HK_ALT or HK_CTRL, f.DefaultHotkey.Modifiers);
|
||||
// Assert.AreEqual(Ord('T'), f.DefaultHotkey.VirtualKey);
|
||||
// Assert.AreEqual(0, f.DefaultHotkey.RawValue);
|
||||
// Assert.AreEqual(0, f.DefaultHotkey.Target);
|
||||
Assert.AreEqual(keUnicode, kbd.Encodings);
|
||||
Assert.AreEqual('test.kmx', ExtractFileName(kbd.Filename));
|
||||
Assert.AreEqual('test', kbd.ID);
|
||||
Assert.AreEqual(kltPositional, kbd.LayoutType);
|
||||
Assert.AreEqual('Test Message', kbd.Message);
|
||||
Assert.AreEqual('Test Keyboard', kbd.Name);
|
||||
Assert.AreEqual('1.2.3', kbd.Version);
|
||||
Assert.IsNotNull(kbd.Bitmap);
|
||||
// Assert.AreEqual(f.SerializeXML(...), False);
|
||||
end;
|
||||
|
||||
procedure TKeymanAPITest_Base.CheckPackageProperties(pkg: IKeymanPackage);
|
||||
begin
|
||||
Assert.AreEqual('Keyman', pkg.Author);
|
||||
Assert.AreEqual('mailto:support@keyman.com', pkg.AuthorEmail);
|
||||
Assert.AreEqual('(C) 2017 SIL International', pkg.Copyright);
|
||||
|
||||
Assert.IsNotNull(pkg.Files);
|
||||
// TODO: Check each file
|
||||
|
||||
Assert.IsNotNull(pkg.Fonts);
|
||||
// TODO: Check each font
|
||||
|
||||
Assert.IsNull(pkg.Graphic);
|
||||
Assert.IsNull(pkg.GraphicFile);
|
||||
Assert.AreEqual('test', pkg.ID);
|
||||
Assert.IsNull(pkg.KeyboardOptionsFile);
|
||||
|
||||
Assert.IsNotNull(pkg.Keyboards);
|
||||
Assert.AreEqual(1, pkg.Keyboards.Count);
|
||||
|
||||
Assert.AreEqual('Test Keyboard', pkg.Name);
|
||||
|
||||
Assert.IsNotNull(pkg.ReadmeFile);
|
||||
Assert.AreEqual('readme.txt', ExtractFileName(pkg.ReadmeFile.Filename));
|
||||
|
||||
Assert.IsNull(pkg.UsageFile);
|
||||
Assert.AreEqual('1.2.3', pkg.Version);
|
||||
|
||||
Assert.IsNotNull(pkg.WelcomeFile);
|
||||
Assert.AreEqual('welcome.htm', ExtractFileName(pkg.WelcomeFile.Filename));
|
||||
|
||||
Assert.AreEqual('https://keyman.com/', pkg.Website);
|
||||
end;
|
||||
|
||||
end.
|
||||
|
|
@ -17,7 +17,11 @@ uses
|
|||
Winapi.ActiveX,
|
||||
Keyman.Test.Console.KeymanAPIHost in 'Keyman.Test.Console.KeymanAPIHost.pas',
|
||||
keymanapi_TLB in '..\..\..\engine\kmcomapi\keymanapi_TLB.pas',
|
||||
KeymanOptionNames in '..\..\..\global\delphi\general\KeymanOptionNames.pas';
|
||||
KeymanOptionNames in '..\..\..\global\delphi\general\KeymanOptionNames.pas',
|
||||
Keyman.Test.Console.KeymanAPITest_BCP47 in 'Keyman.Test.Console.KeymanAPITest_BCP47.pas',
|
||||
Keyman.Test.Console.KeymanAPITest_Base in 'Keyman.Test.Console.KeymanAPITest_Base.pas',
|
||||
RegistryKeys in '..\..\..\global\delphi\general\RegistryKeys.pas',
|
||||
KeymanVersion in '..\..\..\global\delphi\general\KeymanVersion.pas';
|
||||
|
||||
var
|
||||
runner : ITestRunner;
|
||||
|
|
|
|||
|
|
@ -111,8 +111,12 @@
|
|||
<MainSource>MainSource</MainSource>
|
||||
</DelphiCompile>
|
||||
<DCCReference Include="Keyman.Test.Console.KeymanAPIHost.pas"/>
|
||||
<DCCReference Include="..\..\engine\kmcomapi\keymanapi_TLB.pas"/>
|
||||
<DCCReference Include="..\..\global\delphi\general\KeymanOptionNames.pas"/>
|
||||
<DCCReference Include="..\..\..\engine\kmcomapi\keymanapi_TLB.pas"/>
|
||||
<DCCReference Include="..\..\..\global\delphi\general\KeymanOptionNames.pas"/>
|
||||
<DCCReference Include="Keyman.Test.Console.KeymanAPITest_BCP47.pas"/>
|
||||
<DCCReference Include="Keyman.Test.Console.KeymanAPITest_Base.pas"/>
|
||||
<DCCReference Include="..\..\..\global\delphi\general\RegistryKeys.pas"/>
|
||||
<DCCReference Include="..\..\..\global\delphi\general\KeymanVersion.pas"/>
|
||||
<BuildConfiguration Include="Release">
|
||||
<Key>Cfg_2</Key>
|
||||
<CfgParent>Base</CfgParent>
|
||||
|
|
@ -135,35 +139,35 @@
|
|||
</Source>
|
||||
</Delphi.Personality>
|
||||
<Deployment Version="3">
|
||||
<DeployFile LocalName="Win32\Debug\keymanapi_test.exe" Configuration="Debug" Class="ProjectOutput">
|
||||
<Platform Name="Win32">
|
||||
<RemoteName>keymanapi_test.exe</RemoteName>
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile LocalName="$(BDS)\Redist\osx32\libcgunwind.1.0.dylib" Class="DependencyModule">
|
||||
<Platform Name="OSX32">
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile LocalName="$(BDS)\Redist\iossimulator\libcgunwind.1.0.dylib" Class="DependencyModule">
|
||||
<Platform Name="iOSSimulator">
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile LocalName="$(BDS)\Redist\iossimulator\libPCRE.dylib" Class="DependencyModule">
|
||||
<Platform Name="iOSSimulator">
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile LocalName="$(BDS)\Redist\osx32\libcgsqlite3.dylib" Class="DependencyModule">
|
||||
<Platform Name="OSX32">
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile LocalName="Win64\Debug\keymanapi_test.exe" Configuration="Debug" Class="ProjectOutput">
|
||||
<Platform Name="Win64">
|
||||
<RemoteName>keymanapi_test.exe</RemoteName>
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile LocalName="Win64\Debug\keymanapi_test.rsm" Configuration="Debug" Class="DebugSymbols">
|
||||
<Platform Name="Win64">
|
||||
<RemoteName>keymanapi_test.rsm</RemoteName>
|
||||
<DeployFile LocalName="$(BDS)\Redist\iossimulator\libPCRE.dylib" Class="DependencyModule">
|
||||
<Platform Name="iOSSimulator">
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile LocalName="$(BDS)\Redist\iossimulator\libcgunwind.1.0.dylib" Class="DependencyModule">
|
||||
<Platform Name="iOSSimulator">
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile LocalName="$(BDS)\Redist\osx32\libcgsqlite3.dylib" Class="DependencyModule">
|
||||
<Platform Name="OSX32">
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,6 @@
|
|||
store(&NAME) 'BCP47 Test'
|
||||
begin Unicode > use(main)
|
||||
|
||||
group(main) using keys
|
||||
|
||||
+ 'a' > 'bcp47 keyboard'
|
||||
BIN
windows/src/test/integration-tests/keymanapi/test/bcp47.kmp
Normal file
BIN
windows/src/test/integration-tests/keymanapi/test/bcp47.kmp
Normal file
Binary file not shown.
BIN
windows/src/test/integration-tests/keymanapi/test/bcp47.kmx
Normal file
BIN
windows/src/test/integration-tests/keymanapi/test/bcp47.kmx
Normal file
Binary file not shown.
41
windows/src/test/integration-tests/keymanapi/test/bcp47.kps
Normal file
41
windows/src/test/integration-tests/keymanapi/test/bcp47.kps
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Package>
|
||||
<System>
|
||||
<KeymanDeveloperVersion>10.0.1021.0</KeymanDeveloperVersion>
|
||||
<FileVersion>7.0</FileVersion>
|
||||
</System>
|
||||
<Options>
|
||||
<ExecuteProgram></ExecuteProgram>
|
||||
<MSIFileName></MSIFileName>
|
||||
<MSIOptions></MSIOptions>
|
||||
</Options>
|
||||
<StartMenu>
|
||||
<Folder></Folder>
|
||||
<Items/>
|
||||
</StartMenu>
|
||||
<Info>
|
||||
<Version URL="">1.0</Version>
|
||||
<Name URL="">BCP47 Test</Name>
|
||||
</Info>
|
||||
<Files>
|
||||
<File>
|
||||
<Name>bcp47.kmx</Name>
|
||||
<Description>Keyboard BCP47 Test</Description>
|
||||
<CopyLocation>0</CopyLocation>
|
||||
<FileType>.kmx</FileType>
|
||||
</File>
|
||||
</Files>
|
||||
<Keyboards>
|
||||
<Keyboard>
|
||||
<Name>BCP47 Test</Name>
|
||||
<ID>bcp47</ID>
|
||||
<Version>1.0</Version>
|
||||
<RTL>True</RTL>
|
||||
<Languages>
|
||||
<Language ID="tpi">Tok Pisin</Language>
|
||||
<Language ID="abg">Abaga</Language>
|
||||
</Languages>
|
||||
</Keyboard>
|
||||
</Keyboards>
|
||||
<Strings/>
|
||||
</Package>
|
||||
103
windows/src/test/integration-tests/keymanapi/test/test.kpj
Normal file
103
windows/src/test/integration-tests/keymanapi/test/test.kpj
Normal file
|
|
@ -0,0 +1,103 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<KeymanDeveloperProject>
|
||||
<Options>
|
||||
<BuildPath></BuildPath>
|
||||
<CompilerWarningsAsErrors>False</CompilerWarningsAsErrors>
|
||||
<WarnDeprecatedCode>True</WarnDeprecatedCode>
|
||||
</Options>
|
||||
<Files>
|
||||
<File>
|
||||
<ID>id_40ba94fbf72e9d4b1e17ea3cbc6e4287</ID>
|
||||
<Filename>test.kmn</Filename>
|
||||
<Filepath>test.kmn</Filepath>
|
||||
<FileVersion>1.2.3</FileVersion>
|
||||
<FileType>.kmn</FileType>
|
||||
<Details>
|
||||
<Name>Test Keyboard</Name>
|
||||
<Copyright>(C) 2017 SIL International</Copyright>
|
||||
<Message>Test Message</Message>
|
||||
</Details>
|
||||
</File>
|
||||
<File>
|
||||
<ID>id_43c2962a46c842a207e8feeac7444b9e</ID>
|
||||
<Filename>test.kps</Filename>
|
||||
<Filepath>test.kps</Filepath>
|
||||
<FileVersion>1.2.3</FileVersion>
|
||||
<FileType>.kps</FileType>
|
||||
<Details>
|
||||
<Name>Test Keyboard</Name>
|
||||
<Copyright>(C) 2017 SIL International</Copyright>
|
||||
<Version>1.2.3</Version>
|
||||
</Details>
|
||||
</File>
|
||||
<File>
|
||||
<ID>id_93662347dadf4f8457343f345e633233</ID>
|
||||
<Filename>bcp47.kps</Filename>
|
||||
<Filepath>bcp47.kps</Filepath>
|
||||
<FileVersion>1.0</FileVersion>
|
||||
<FileType>.kps</FileType>
|
||||
<Details>
|
||||
<Name>BCP47 Test</Name>
|
||||
<Version>1.0</Version>
|
||||
</Details>
|
||||
</File>
|
||||
<File>
|
||||
<ID>id_99c63a38148734593a9a8e3982e4aca5</ID>
|
||||
<Filename>bcp47.kmn</Filename>
|
||||
<Filepath>bcp47.kmn</Filepath>
|
||||
<FileVersion>1.0</FileVersion>
|
||||
<FileType>.kmn</FileType>
|
||||
<Details>
|
||||
<Name>BCP47 Test</Name>
|
||||
</Details>
|
||||
</File>
|
||||
<File>
|
||||
<ID>id_5df400e6f9f0f1b01651c61d86ff8f23</ID>
|
||||
<Filename>test.kvk</Filename>
|
||||
<Filepath>test.kvk</Filepath>
|
||||
<FileVersion></FileVersion>
|
||||
<FileType>.kvk</FileType>
|
||||
<ParentFileID>id_43c2962a46c842a207e8feeac7444b9e</ParentFileID>
|
||||
</File>
|
||||
<File>
|
||||
<ID>id_230d4faf67c42acd737cc6c82600abc2</ID>
|
||||
<Filename>test.kmx</Filename>
|
||||
<Filepath>test.kmx</Filepath>
|
||||
<FileVersion></FileVersion>
|
||||
<FileType>.kmx</FileType>
|
||||
<ParentFileID>id_43c2962a46c842a207e8feeac7444b9e</ParentFileID>
|
||||
</File>
|
||||
<File>
|
||||
<ID>id_baf6639217cac055ff5e648f2b14832e</ID>
|
||||
<Filename>keymanweb-osk.ttf</Filename>
|
||||
<Filepath>keymanweb-osk.ttf</Filepath>
|
||||
<FileVersion></FileVersion>
|
||||
<FileType>.ttf</FileType>
|
||||
<ParentFileID>id_43c2962a46c842a207e8feeac7444b9e</ParentFileID>
|
||||
</File>
|
||||
<File>
|
||||
<ID>id_eb6b6c90251ab33cee784713c451e6d8</ID>
|
||||
<Filename>readme.txt</Filename>
|
||||
<Filepath>readme.txt</Filepath>
|
||||
<FileVersion></FileVersion>
|
||||
<FileType>.txt</FileType>
|
||||
<ParentFileID>id_43c2962a46c842a207e8feeac7444b9e</ParentFileID>
|
||||
</File>
|
||||
<File>
|
||||
<ID>id_9a2fbfc6076553fc8f8cae9f6ac5d05d</ID>
|
||||
<Filename>welcome.htm</Filename>
|
||||
<Filepath>welcome.htm</Filepath>
|
||||
<FileVersion></FileVersion>
|
||||
<FileType>.htm</FileType>
|
||||
<ParentFileID>id_43c2962a46c842a207e8feeac7444b9e</ParentFileID>
|
||||
</File>
|
||||
<File>
|
||||
<ID>id_585856c9c8411cde30e57ab4ab0714ab</ID>
|
||||
<Filename>bcp47.kmx</Filename>
|
||||
<Filepath>bcp47.kmx</Filepath>
|
||||
<FileVersion></FileVersion>
|
||||
<FileType>.kmx</FileType>
|
||||
<ParentFileID>id_93662347dadf4f8457343f345e633233</ParentFileID>
|
||||
</File>
|
||||
</Files>
|
||||
</KeymanDeveloperProject>
|
||||
Loading…
Add table
Reference in a new issue