Skip to content

Commit

Permalink
Merge pull request #35 from tdakkota/fix/issue-33
Browse files Browse the repository at this point in the history
fix(types): off-by-one error
  • Loading branch information
tdakkota authored Jun 11, 2022
2 parents 4151125 + 20bff6b commit 8566457
Show file tree
Hide file tree
Showing 7 changed files with 106 additions and 25 deletions.
69 changes: 69 additions & 0 deletions idx_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package win32metadata

import (
"bytes"
"debug/pe"
_ "embed"
"testing"

"github.com/stretchr/testify/require"

"github.com/tdakkota/win32metadata/md"
"github.com/tdakkota/win32metadata/types"
)

var (
//go:embed md/_testdata/Windows.Win32.winmd
win32 []byte
)

func TestIssue33(t *testing.T) {
a := require.New(t)

f, err := pe.NewFile(bytes.NewReader(win32))
a.NoError(err)
defer f.Close()

c, err := types.FromPE(f)
a.NoError(err)

tt := c.Table(md.InterfaceImpl)
var row types.InterfaceImpl
for i := uint32(0); i < tt.RowCount(); i++ {
a.NoError(row.FromRow(tt.Row(i)))

class, err := row.ResolveClass(c)
a.NoError(err)

// https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nn-shobjidl_core-ishellitemarray
if class.TypeNamespace != "Windows.Win32.UI.Shell" ||
class.TypeName != "IShellItemArray" {
continue
}

ns, name, err := c.ResolveTypeDefOrRefName(row.Interface)
a.NoError(err)
a.Equal("Windows.Win32.System.Com", ns)
a.Equal("IUnknown", name)

methods, err := class.ResolveMethodList(c)
a.NoError(err)

var names []string
for _, m := range methods {
names = append(names, m.Name)
}
a.Equal([]string{
"BindToHandler",
"GetPropertyStore",
"GetPropertyDescriptionList",
"GetAttributes",
"GetCount",
"GetItemAt",
"EnumItems",
}, names)

return
}
t.Fatal("Can't find Windows.Win32.UI.Shell.IShellItemArray")
}
File renamed without changes.
File renamed without changes.
23 changes: 19 additions & 4 deletions md/metadata_test.go
Original file line number Diff line number Diff line change
@@ -1,17 +1,33 @@
package md

import (
"bytes"
"debug/pe"
"embed"
"testing"

"github.com/stretchr/testify/require"
)

var (
//go:embed _testdata
testdata embed.FS
)

func openTestData(a *require.Assertions, p string) *pe.File {
data, err := testdata.ReadFile(p)
a.NoError(err)

f, err := pe.NewFile(bytes.NewReader(data))
a.NoError(err)

return f
}

func TestParseMetadata(t *testing.T) {
a := require.New(t)

f, err := pe.Open(`./testdata/.windows/winmd/Windows.Win32.winmd`)
a.NoError(err)
f := openTestData(a, `_testdata/Windows.Win32.winmd`)
defer f.Close()

m, err := ParseMetadata(f)
Expand All @@ -33,8 +49,7 @@ func TestParseMetadata(t *testing.T) {
func TestMetadata_StreamByName(t *testing.T) {
a := require.New(t)

f, err := pe.Open(`./testdata/.windows/winmd/Windows.Win32.winmd`)
a.NoError(err)
f := openTestData(a, `_testdata/Windows.WinRT.winmd`)
defer f.Close()

m, err := ParseMetadata(f)
Expand Down
6 changes: 1 addition & 5 deletions md/table_header_test.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package md

import (
"debug/pe"
"testing"

"github.com/stretchr/testify/require"
Expand All @@ -10,10 +9,7 @@ import (
func TestMetadata_Tables(t *testing.T) {
a := require.New(t)

f, err := pe.Open(`./testdata/.windows/winmd/Windows.Win32.winmd`)
if err != nil {
t.Fatal(err)
}
f := openTestData(a, "_testdata/Windows.Win32.winmd")
defer f.Close()

file, err := ParseMetadata(f)
Expand Down
28 changes: 14 additions & 14 deletions types/from_row.gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions types/mk_from_row.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
//+build ignore
//go:build ignore
// +build ignore

package main

Expand Down Expand Up @@ -255,7 +256,7 @@ func (f *{{ $.Name }}) Resolve{{ $column.Name }}(c *Context) ({{ template "resol
return result, nil
{{- else }}
var t {{ $column.Index }}
if err := t.FromRow(table.Row(uint32(f.{{ $column.Name }}))); err != nil {
if err := t.FromRow(table.Row(uint32(f.{{ $column.Name }})-1)); err != nil {
return t, err
}
return t, nil
Expand Down

0 comments on commit 8566457

Please sign in to comment.