• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

CityOfZion / neo3-boa / 0aff654d-b027-49a1-9d97-558d9a2a52ff

05 Mar 2024 04:57PM UTC coverage: 91.985% (-0.1%) from 92.106%
0aff654d-b027-49a1-9d97-558d9a2a52ff

push

circleci

web-flow
Merge pull request #1215 from CityOfZion/CU-86drpndkk

CU-86drpndkk - Refactor test_interop/test_blockchain.py to use BoaTestConstructor

1 of 1 new or added line in 1 file covered. (100.0%)

658 existing lines in 143 files now uncovered.

20635 of 22433 relevant lines covered (91.99%)

1.84 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

81.25
/boa3/internal/model/builtin/classmethod/appendmethod.py
1
from collections.abc import Sized
2✔
2
from typing import Any
2✔
3

4
from boa3.internal.model.builtin.method.builtinmethod import IBuiltinMethod
2✔
5
from boa3.internal.model.expression import IExpression
2✔
6
from boa3.internal.model.type.collection.sequence.mutable.mutablesequencetype import MutableSequenceType
2✔
7
from boa3.internal.model.variable import Variable
2✔
8
from boa3.internal.neo.vm.opcode.Opcode import Opcode
2✔
9

10

11
class AppendMethod(IBuiltinMethod):
2✔
12
    def __init__(self, sequence_type: MutableSequenceType = None):
2✔
13
        if not isinstance(sequence_type, MutableSequenceType):
2✔
14
            from boa3.internal.model.type.type import Type
2✔
15
            self_arg = Variable(Type.mutableSequence)
2✔
16
            item_arg = Variable(Type.any)
2✔
17
        else:
18
            self_arg = Variable(sequence_type)
2✔
19
            item_arg = Variable(sequence_type.value_type)
2✔
20

21
        identifier = 'append'
2✔
22
        args: dict[str, Variable] = {'self': self_arg, 'item': item_arg}
2✔
23
        super().__init__(identifier, args)
2✔
24

25
    @property
2✔
26
    def _arg_self(self) -> Variable:
2✔
UNCOV
27
        return self.args['self']
×
28

29
    @property
2✔
30
    def stores_on_slot(self) -> bool:
2✔
31
        return True
2✔
32

33
    def validate_parameters(self, *params: IExpression) -> bool:
2✔
34
        if len(params) != 2:
×
35
            return False
×
36
        if not all(isinstance(param, IExpression) for param in params):
×
UNCOV
37
            return False
×
38

39
        from boa3.internal.model.type.itype import IType
×
40
        sequence_type: IType = params[0].type
×
UNCOV
41
        value_type: IType = params[1].type
×
42

43
        if not isinstance(sequence_type, MutableSequenceType):
×
44
            return False
×
UNCOV
45
        return sequence_type.value_type.is_type_of(value_type)
×
46

47
    def generate_opcodes(self, code_generator):
2✔
48
        from boa3.internal.model.operation.binaryop import BinaryOp
2✔
49
        from boa3.internal.model.type.type import Type
2✔
50
        from boa3.internal.neo.vm.type.StackItem import StackItemType
2✔
51

52
        code_generator.duplicate_stack_item(2)
2✔
53
        code_generator.insert_type_check(StackItemType.Buffer)  # append opcode only works for array
2✔
54
        # if self is bytes
55
        if_bytes = code_generator.convert_begin_if()
2✔
56
        #   result = self + arg     # when it's bytearray, concatenates the value
57
        code_generator.convert_operation(BinaryOp.Concat.build(Type.bytearray, Type.bytearray))
2✔
58

59
        # else:
60
        else_bytes = code_generator.convert_begin_else(if_bytes, is_internal=True)
2✔
61
        #   self.append()
62
        super().generate_opcodes(code_generator)
2✔
63

64
        code_generator.convert_end_if(else_bytes, is_internal=True)
2✔
65

66
    def generate_internal_opcodes(self, code_generator):
2✔
67
        code_generator.insert_opcode(Opcode.APPEND)
2✔
68

69
    def push_self_first(self) -> bool:
2✔
70
        return self.has_self_argument
2✔
71

72
    @property
2✔
73
    def _args_on_stack(self) -> int:
2✔
74
        return len(self.args)
2✔
75

76
    @property
2✔
77
    def _body(self) -> str | None:
2✔
UNCOV
78
        return None
×
79

80
    def build(self, value: Any) -> IBuiltinMethod:
2✔
81
        if isinstance(value, Sized) and len(value) > 0:
2✔
82
            value = value[0]
2✔
83
        if value == self.args['self'].type:
2✔
84
            return self
2✔
85
        if isinstance(value, MutableSequenceType):
2✔
86
            return AppendMethod(value)
2✔
87
        return super().build(value)
2✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc