Skip to content

Commit

Permalink
Fix tests for native interface types.
Browse files Browse the repository at this point in the history
  • Loading branch information
RZhang05 committed Sep 27, 2024
1 parent 6298e1f commit aa51455
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 31 deletions.
4 changes: 4 additions & 0 deletions runtime/interpreter/interpreter.go
Original file line number Diff line number Diff line change
Expand Up @@ -4866,6 +4866,10 @@ func (interpreter *Interpreter) GetInterfaceType(
typeID TypeID,
) (*sema.InterfaceType, error) {
if location == nil {
var interfaceType = sema.NativeInterfaceTypes[qualifiedIdentifier]
if interfaceType != nil {
return interfaceType, nil
}
return nil, InterfaceMissingLocationError{
QualifiedIdentifier: qualifiedIdentifier,
}
Expand Down
52 changes: 23 additions & 29 deletions runtime/sema/stringer.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,43 +23,37 @@ import (
"github.com/onflow/cadence/runtime/common"
)

const StringerTypeToStringFunctionName = "toString"
const StringerTypeName = "Stringer"

var StringerTypeToStringFunctionType = &FunctionType{
Purity: FunctionPurityView,
ReturnTypeAnnotation: NewTypeAnnotation(
StringType,
),
}
var StringerType = func() *InterfaceType {

const StringerTypeToStringFunctionDocString = `
Returns this object as a String.
`
stringerType := &InterfaceType{
Identifier: StringerTypeName,
CompositeKind: common.CompositeKindStructure,
Members: &StringMemberOrderedMap{},
}

const StringerTypeName = "Stringer"
const StringerTypeToStringFunctionDocString = `Returns this object as a String.`

var StringerType = InterfaceType{
Location: nil,
Identifier: StringerTypeName,
CompositeKind: common.CompositeKindStructure,
Members: &StringMemberOrderedMap{},
}
const StringerTypeToStringFunctionName = "toString"

func init() {
StringerType.Members.Set(StringerTypeToStringFunctionName, NewUnmeteredFunctionMember(
&StringerType,
PrimitiveAccess(ast.AccessAll),
StringerTypeToStringFunctionName,
StringerTypeToStringFunctionType,
StringerTypeToStringFunctionDocString,
))
StringerType.memberResolvers = MembersAsResolvers([]*Member{
var StringerTypeToStringFunctionType = &FunctionType{
Purity: FunctionPurityView,
ReturnTypeAnnotation: NewTypeAnnotation(
StringType,
),
}

var members = []*Member{
NewUnmeteredFunctionMember(
&StringerType,
stringerType,
PrimitiveAccess(ast.AccessAll),
StringerTypeToStringFunctionName,
StringerTypeToStringFunctionType,
StringerTypeToStringFunctionDocString,
),
})
}
}

stringerType.Members = MembersAsMap(members)
return stringerType
}()
33 changes: 32 additions & 1 deletion runtime/sema/type.go
Original file line number Diff line number Diff line change
Expand Up @@ -4198,7 +4198,7 @@ func init() {
DeploymentResultType,
HashableStructType,
&InclusiveRangeType{},
&StringerType,
StringerType,
},
)

Expand Down Expand Up @@ -9552,3 +9552,34 @@ func init() {
})
}
}

var NativeInterfaceTypes = map[string]*InterfaceType{}

func init() {
interfaceTypes := []*InterfaceType{
StringerType,
}

for len(interfaceTypes) > 0 {
lastIndex := len(interfaceTypes) - 1
interfaceType := interfaceTypes[lastIndex]
interfaceTypes[lastIndex] = nil
interfaceTypes = interfaceTypes[:lastIndex]

NativeInterfaceTypes[interfaceType.QualifiedIdentifier()] = interfaceType

nestedTypes := interfaceType.NestedTypes
if nestedTypes == nil {
continue
}

nestedTypes.Foreach(func(_ string, nestedType Type) {
nestedInterfaceType, ok := nestedType.(*InterfaceType)
if !ok {
return
}

interfaceTypes = append(interfaceTypes, nestedInterfaceType)
})
}
}
4 changes: 4 additions & 0 deletions runtime/sema/type_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2378,6 +2378,10 @@ func TestTypeInclusions(t *testing.T) {
return
}

if _, ok := typ.(*InterfaceType); ok {
return
}

if typ.IsResourceType() {
return
}
Expand Down
26 changes: 25 additions & 1 deletion runtime/tests/interpreter/stringer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,10 @@ package interpreter_test
import (
"testing"

"github.com/stretchr/testify/require"

"github.com/onflow/cadence/runtime/interpreter"
. "github.com/onflow/cadence/runtime/tests/utils"
"github.com/stretchr/testify/require"
)

func TestStringerBasic(t *testing.T) {
Expand Down Expand Up @@ -52,3 +53,26 @@ func TestStringerBasic(t *testing.T) {
result,
)
}

func TestStringerBuiltIn(t *testing.T) {

t.Parallel()

inter := parseCheckAndInterpret(t, `
access(all)
fun test() :String {
let v = 1
return v.toString()
}
`)

result, err := inter.Invoke("test")
require.NoError(t, err)

RequireValuesEqual(
t,
inter,
interpreter.NewUnmeteredStringValue("1"),
result,
)
}

0 comments on commit aa51455

Please sign in to comment.